功能区别
- 处理数据类型
- 字节流:主要用于处理二进制数据,像图片、音频、视频等文件,它以字节(8位)为单位进行读写操作。例如
FileInputStream
读取文件时,是按字节逐个读取。
- 字符流:专门用于处理字符数据,适合处理文本文件。它以字符(16位,在Java中
char
类型是16位)为单位进行读写,能更好地处理不同字符编码,如UTF - 8、GBK等。
- 适用场景
- 字节流:适用于所有类型文件的通用读写,特别是非文本文件,如可执行文件、压缩文件等。比如使用
FileOutputStream
将数据写入一个图片文件。
- 字符流:主要用于文本文件的读写,对字符编码有更好的支持,处理文本时更方便。例如使用
FileReader
读取一个包含中文的文本文件。
底层实现机制区别
- 缓冲机制
- 字节流:默认没有字符流那样的字符缓冲机制。不过可以通过
BufferedInputStream
和BufferedOutputStream
来实现缓冲功能,提高读写效率。例如:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file.txt"));
- **字符流**:部分字符流类,如`BufferedReader`和`BufferedWriter`,默认提供了字符缓冲机制,以减少磁盘I/O操作次数。例如:
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
- 编码解码
- 字节流:不涉及字符编码解码过程,它只是简单地读取和写入字节数据,对数据内容不做任何字符编码方面的处理。
- 字符流:在读取和写入字符时,会涉及字符编码和解码操作。例如
FileReader
在读取文件时,会根据系统默认编码或指定编码将字节数据解码为字符;FileWriter
在写入时,会将字符编码为字节数据再写入文件。可以通过InputStreamReader
和OutputStreamWriter
来指定字符编码,如:
InputStreamReader isr = new InputStreamReader(new FileInputStream("file.txt"), "UTF - 8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("file.txt"), "UTF - 8");