实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。
01.package org.lxh.demo12.byteiodemo;
02.import java.io.File;
03.import java.io.FileOutputStream;
04.import java.io.OutputStream;
05.public class OutputStreamDemo05 {
06.public static void main(String[] args) throws Exception { // 异常抛出, 不处理
07.// 第1步:使用File类找到一个文件
08. File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
09.// 第2步:通过子类实例化父类对象
10. OutputStream out = null;
11.// 准备好一个输出的对象
12. out = new FileOutputStream(f);
13.// 通过对象多态性进行实例化
14.// 第3步:进行写操作
15. String str = "Hello World!!!";
16.// 准备一个字符串
17. byte b[] = str.getBytes();
18.// 字符串转byte数组
19. out.write(b);
20.// 将内容输出
21. // 第4步:关闭输出流
22. // out.close();
23.// 此时没有关闭
24. }
25. }
此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。
01.package org.lxh.demo12.chariodemo;
02.import java.io.File;
03.import java.io.FileWriter;
04.import java.io.Writer;
05.public class WriterDemo03 {
06. public static void main(String[] args) throws Exception { // 异常抛出, 不处理
07. // 第1步:使用File类找到一个文件
08. File f = new File("d:" + File.separator + "test.txt");// 声明File 对象
09. // 第2步:通过子类实例化父类对象
10. Writer out = null;
11.// 准备好一个输出的对象
12. out = new FileWriter(f);
13.// 通过对象多态性进行实例化
14. // 第3步:进行写操作
15. String str = "Hello World!!!";
16.// 准备一个字符串
17. out.write(str);
18.// 将内容输出
19. // 第4步:关闭输出流
20. // out.close();
21.// 此时没有关闭
22. }
23.}
程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而 在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
希望对楼主有所帮助。我们一起努力。 |