我们在 Java 字节流 教程和 Java 字符流 教程中看到它们都能够对文件进行写入和读取,那么两个类对文件操作有什么不同的地方呢?
实际上字节流在对文件操作的时候,不会用到缓冲区(内存),对文件本身直接操作而字符流在对文件操作的时候用到了缓冲区,通过缓冲区来对文件进行操作。
package com.haicoder.net.stream;
import java.io.*;
public class ByteAndCharStream {
public static void main(String[] args) throws Exception {
System.out.println("嗨客网(www.haicoder.net)");
String appendInfo = "嗨客网,你好啊!\r\n"; //\r\n 在追加文件的时候,表示换行
System.out.println("===========字节流不关闭输出流==============");
File file = new File("/Users/haicoder/Documents/code/hai/outputstream.txt"); //如果文件不存在,会自动创建
OutputStream outputStream = new FileOutputStream(file, true); //true 表示可以在文件中追加内容 false 表示不能追加
byte b[] = appendInfo.getBytes();
outputStream.write(b); //调用 write(byte b[]) 方法
//outputStream.close(); 将流关闭
System.out.println("=====字符流不关闭输出流=======");
File file1 = new File("/Users/haicoder/Documents/code/hai/writer.txt"); //如果文件不存在,会自动创建
Writer writer = new FileWriter(file1);
writer.write(appendInfo); //文件没有,创建并写入
writer.write(appendInfo); //追加文件内容
//writer.close(); 将流关闭
}
}
运行结果如下
生成的文件和内容如下
我们看到,outputStream 没有关闭,但是文件里面会将内容写入,writer 没有 close,对应的文件里面没有数据,字节流是对文件直接操作的,所以文件里面将内容写进去了,而字符流是面向缓冲区的,在关闭文件的时候会将缓冲区里面的内容写入文件中,或者调用 flush 方法,将缓冲区里面的内容强制刷到文件里面。
在某些情况下,需要对文件资源进行频繁的操作,在这样的情况下性能就会比较低,这个时候为了提升性能,可以将一部分的数据暂时存放在缓冲区里面,后面再操作数据的时候,直接从缓冲区里面获取,这样会提升性能。
字节流是直接对文件操作的,字符流是面向缓冲区的,在平时开发过程中,建议使用字节流。因为文件在硬盘或者传输的时候,都是以字节的方式进行的,字符只会在内存中才会形成。