之前在复习IO的时候,为了方便记忆,提到了以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流。
除了在使用上的不一样,那究竟两者有什么区别呢。直接给出结论:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
测试方法:使用OutputStream和Writer分别对文本文件做写入,但是并不关闭、不刷新(flush)输出流,执行后看是否能成功写入。
OutputStream
package com.leolee.eurekaclient.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Tests { public static void main(String[] args) throws IOException { final String text = "Hello"; File file = new File("C:" + File.separator + "Users" + File.separator + "LeoLee" + File.separator + "Desktop" + File.separator + "test.txt"); OutputStream outputStream = null; outputStream = new FileOutputStream(file); //将文本写入文件,但是并不关闭OutputStream outputStream.write(text.getBytes()); } }执行结果如下:
Writer
package com.leolee.eurekaclient.test; import java.io.*; public class Tests { public static void main(String[] args) throws IOException { final String text = "Hello"; File file = new File("C:" + File.separator + "Users" + File.separator + "LeoLee" + File.separator + "Desktop" + File.separator + "test.txt"); //将文本写入文件,但是并不关闭OutputStream Writer out = null; out = new FileWriter(file); out.write(text); } }执行结果如下:
结果表明,字节流是直接操作了文件,字符流是操作了缓冲区。
在开发过程中,字节流往往比字符流使用更广泛,原因也很简单,计算机本身数据的传输即使以字节为单位的,图片、视频等非文本文件也只能用字节流做处理。字符流只是方便了文本数据的读写,通过字符集的转化来实现的。