Java 字符流
什么是字符流
在Java IO体系中,字符流是专门用来处理字符数据的IO流 。与字节流不同,字符流以字符为单位进行输入输出操作,这使得它非常适合处理文本文件和其他基于字符的数据。
字符流的设计是为了解决字节流在处理多字节字符时可能出现的问题,尤其是在处理国际化字符集时。字符流内部会进行字节到字符的转换,自动处理编码问题。
备注
Java中的字符是使用Unicode编码表示的,每个字符占用两个字节。
字符流体系结构
Java字符流的类层次结构主要基于两个抽象类:Reader
和Writer
。
Reader类介绍
Reader
是所有字符输入流的抽象基类,它定义了以字符为单位读取数据的方法。
主要方法包括:
read()
: 读取单个字符read(char[] cbuf)
: 将字符读入数组read(char[] cbuf, int off, int len)
: 将字符读入数组的一部分close()
: 关闭流并释放资源
常用的Reader子类
FileReader
FileReader
用于从文件中读取字符数据。它是InputStreamReader
的子类,默认使用系统的字符编码。
try (FileReader reader = new FileReader("example.txt")) {
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader
BufferedReader
为其他Reader对 象添加缓冲功能,提高读取效率,并提供了方便的readLine()
方法来读取一行文本。
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();
}
InputStreamReader
InputStreamReader
是字节流到字符流的桥梁,它可以指定字符编码,将字节转换为字符。
try (InputStreamReader reader = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8")) {
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
} catch (IOException e) {
e.printStackTrace();
}
Writer类介绍
Writer
是所有字符输出流的抽象基类,它定义了以字符为单位写入数据的方法。
主要方法包括:
write(int c)
: 写入单个字符write(char[] cbuf)
: 写入字符数组write(String str)
: 写入字符串write(String str, int off, int len)
: 写入字符串的一部分flush()
: 刷新流close()
: 关闭流并释放资源
常用的Writer子类
FileWriter
FileWriter
用于向文件写入字符数据,是OutputStreamWriter
的子类, 默认使用系统的字符编码。
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write("Hello, Java IO!");
} catch (IOException e) {
e.printStackTrace();
}
BufferedWriter
BufferedWriter
为其他Writer对象添加缓冲功能,提高写入效率,并提供了方便的newLine()
方法来写入一行分隔符。
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("第一行");
writer.newLine();
writer.write("第二行");
} catch (IOException e) {
e.printStackTrace();
}
OutputStreamWriter
OutputStreamWriter
是字符流到字节流的桥梁,它可以指定字符编码,将字符转换为字节。
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8")) {
writer.write("使用UTF-8编码写入中文");
} catch (IOException e) {
e.printStackTrace();
}
字符流与字节流的区别
- 处理单位不同:字节流以字节为单位,字符流以字符为单位
- 编码处理:字符流自动处理字符编码转换,字节流不处理
- 适用场景:字符流适合处理文本,字节流适合处理二进制数据
- 缓冲区