字节流_高效流复制文件的四种方式

103 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

1).字节流:
           1).输出流:OutputStream
                          |--FileOutputStream(基本输出流)!
                          |--FilterOutputStream
                                    BufferedOutputStream(高效流、缓冲流)
           2).输入流:InputStream
                          |--FIleInputStream(基本输入流)!
                          |--FilterInputStream
                                    BufferedInputStream(高效流、缓冲流)
2). 字符流:
           1).输出流:Writer
                          |--OutputStreamWriter(转换流)
                                    |--FileWriter(基本的输出流)
                          |--BufferedWriter(缓冲流)
           2).输入流:Reader
                          |--InputStreamReader(转换流)
                                    |--FileReader(基本的输入流)
                          |--BufferedReader(缓冲流)

1.用基本流 一个一个字节复制

public static void copyFile01() throws Exception {
	FileInputStream in = new FileInputStream("copy.txt");
	FileOutputStream out = new FileOutputStream("copy01.txt");
	int b = 0;
	while ((b = in.read()) != -1) {
		out.write(b);
	}
	out.close();
	in.close();
}

2.用基本流 一次一个字符数组复制

public static void copyFile02() throws Exception {
	FileInputStream in = new FileInputStream("copy.txt");
	FileOutputStream out = new FileOutputStream("copy02.txt");
	byte[] arr = new byte[1024];
	int len = 0;
	while ((len = in.read(arr)) != -1) {
		out.write(arr, 0, len);
	}
	out.close();
	in.close();
}

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式),所以提供了字节缓冲区流

3.用高效流 一次一个字节复制

public static void copyFile03() throws Exception {
	BufferedInputStream in = new BufferedInputStream(new FileInputStream("copy.txt"));
	BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("copy03.txt"));
	int b = 0;
	while ((b = in.read()) != -1) {
		out.write(b);
	}
	out.close();
	in.close();
}

4.用高效流 一次一个字符数组复制

public static void copyFile04() throws Exception {
	BufferedInputStream in = new BufferedInputStream(new FileInputStream("copy.txt"));
	BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("copy04.txt"));
	byte[] arr = new byte[1024];
	int len = 0;
	while ((len = in.read(arr)) != -1) {
		out.write(arr, 0, len);
	}
	out.close();
	in.close();
}

缓冲流为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream或者InputStream对象呢?

原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。

5.基本流和高效流图例

image.png

image.png