1. 数据处理方式
- 字节流:以字节(8位)为单位处理数据,适用于处理所有类型的数据,如图片、音频、视频等二进制文件。因为这些文件的数据本身就是以字节形式存储的,字节流可以直接读取和写入这些原始字节数据。
- 字符流:以字符为单位处理数据,Java中字符采用Unicode编码,一个字符通常占16位(2个字节)。字符流适用于处理文本文件,它会自动处理字符编码转换,例如将字节数据按照指定的字符编码(如UTF - 8、GBK等)转换为字符。
2. 缓冲区使用
- 字节流:本身不提供字符缓冲功能。但可以通过
BufferedInputStream
来实现缓冲区功能,提高读取效率。在没有使用BufferedInputStream
时,每次读取操作可能直接与底层设备交互。
- 字符流:字符流中的
BufferedReader
提供了字符缓冲功能。字符流在读取数据时,会将一定数量的字符读入缓冲区,这样可以减少对底层设备的读取次数,提高读取效率。
3. 适用场景
- 字节流:
- 适用于处理二进制文件,如
.jpg
、.mp3
、.zip
等。因为这些文件不能简单地按字符来理解,它们的数据结构是基于字节的。
- 当需要对文件内容进行底层、精确的字节级操作时,如文件的加密、解密,修改文件特定字节位置的数据等,字节流是更好的选择。
- 字符流:
- 专门用于处理文本文件,如
.txt
、.java
、.html
等。由于字符流会自动处理字符编码转换,对于文本文件的读取和写入更加方便,能避免很多编码相关的问题。
- 当需要对文本进行按行读取、字符处理等操作时,字符流提供了更便捷的方法,如
BufferedReader
的readLine()
方法可以方便地按行读取文本。
4. 示例代码
字节流读取文件示例
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ByteStreamExample {
public static void main(String[] args) {
try (InputStream inputStream = new FileInputStream("example.txt")) {
int data;
while ((data = inputStream.read()) != -1) {
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
字符流读取文件示例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CharacterStreamExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}