缓冲字节流(BufferedInputStream、BufferedOutputStream)
BufferedInputStream 是输入流,字节流,处理流;BufferedOutputStream 是输出流,字节流,处理流。
缓冲字节流是对其他字节流的包装,不直接读写数据源设备,缓冲流的工作原理如下:
import java.io.*; /* // 分别测试四种方式的效率 1.一次读写一个字节 ③ 2.一次读写一个字节数组 ① 3.缓冲流一次读写一个字节 ② 4.缓冲流一次读写一个字节数组 ① 优先使用这种 */ public class Test { public static void main(String[] args) throws IOException { // copyFile01(); // copyFile02(); // copyFile03(); copyFile04(); } // 一次读写一个字节:109s public static void copyFile01() throws IOException{ FileInputStream fis = new FileInputStream("D:\\course\\资料\\nwt_setup_3.4.3045.exe"); FileOutputStream fos = new FileOutputStream("day09\\nwt_setup_3.4.3045.exe"); long start = System.currentTimeMillis(); // 获取当前时间 int by; while ((by = fis.read()) != -1){ fos.write(by); } long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start) + "ms"); fis.close(); fos.close(); } // 8192字节数组:46ms 、1024字节数组:183ms public static void copyFile02() throws IOException{ FileInputStream fis = new FileInputStream("D:\\course\\资料\\nwt_setup_3.4.3045.exe"); FileOutputStream fos = new FileOutputStream("day09\\nwt_setup_3.4.3045.exe"); long start = System.currentTimeMillis(); // 获取当前时间 int len; byte[] bytes = new byte[1024]; // 定义数组 while ((len = fis.read(bytes)) != -1){ fos.write(bytes,0,len); } long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start) + "ms"); fis.close(); fos.close(); } // 时间894ms 缓冲区大小默认8192字节 public static void copyFile03() throws IOException{ FileInputStream fis = new FileInputStream("D:\\course\\资料\\nwt_setup_3.4.3045.exe"); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream("day09\\nwt_setup_3.4.3045.exe"); BufferedOutputStream bos = new BufferedOutputStream(fos); long start = System.currentTimeMillis(); // 获取当前时间 int by; while ( (by = bis.read()) != -1){ bos.write(by); } long end = System.currentTimeMillis(); System.out.println("时间:" + (end - start) + "ms"); // bos.flush(); // 手动刷新缓冲区 bis.close(); // 关闭此输入流并释放与该流关联的所有系统资源 bos.close(); // 将缓冲区中最后一次没有满的数据,手动刷新到文件中 } // 1024字节数组 + 8192缓冲区 62ms / 8192字节数组 + 8192缓冲区 45 - 55ms之间 public static void copyFile04() throws IOException{ FileInputStream fis = new FileInputStream("D:\\course\\资料\\nwt_setup_3.4.3045.exe"); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream("day09\\nwt_setup_3.4.3045.exe"); BufferedOutputStream bos = new BufferedOutputStream(fos); long start = System.currentTimeMillis(); // 获取当前时间 int len; byte[] bytes = new byte[8192]; // 定义数组 while ((len = bis.read(bytes)) != -1){ bos.write(bytes,0,len); } long end = System.currentTimeMillis(); System.out.println("时间:" + (end - start) + "ms"); bis.close(); bos.close(); } }