概述
字符流是针对字符数据的特点进行过优化的,因而提供了一些面向字符的有用特性,字符流的源或目标通常是文本文件。 Reader
和 Writer
是 java.io 包中所有字符流的父类。由于它们都是抽象类,所以应该使用它们的子类来创建实体对象,利用对象来处理相关的读写操作。 Reader
和 Writer
的子类又可以分为两大类:一类用来从数据源读入数据或往目的地写出数据(节点流),另一类对数据执行某种处理(处理流)。
一个值得注意的小知识点是:Java 把一个汉字或一个英文字母作为一个字符对待,回车或换行作为两个字符对待。
Reader
Reader 类的层次结构图:
Reader 的主要子类及说明
类名 | 功能描述 |
| 从字节数组读取的输入流 |
| 从字符数组读取的输入流 |
| 输入管道 |
| 将字节转换到字符 的输入流 |
| 过滤输入流 |
| 从字符串读取的输入流 |
| 为输入流附加行号 |
| 返回一个字符并把此字节放回输入流 |
| 从文件读取的输入流 |
Reader 提供的方法
方法 | 功能描述 |
| 关闭输入流 |
| 标记输入流的当前位置 |
| 测试输入流是否支持 mark |
| 从输入流中读取一个字符 |
| 从输入流中读取字符数组 |
| 从输入流中自 off 下标开始读取 len 长度的字符到 ch 内 |
| 测试流是否可以读取 |
| 重定位输入流 |
| 跳过流内的 n 个字符 |
Writer
Writer 类的层次结构图:
Writer 的主要子类及其说明
类名 | 功能说明 |
| 写到字符数组的输出流 |
| 缓冲输出字符流 |
| 输出管道 |
| 转换字符到字节 的输出流 |
| 过滤输出流 |
| 输出到字符串 的输出流 |
| 包含 |
| 输出到文件 的输出流 |
Writer 提供的方法
方法 | 功能描述 |
| 关闭输出流 |
| 将缓冲区中的数据写到文件中 |
| 将单一字符 c 输出到流中 |
| 将字符串 str 输出到流中 |
| 将字符数组 ch 输出到流中 |
| 将一个数组内字 offset 起到 length 的字符输出到流 |
一些实例
FileReader 和 FileWriter
以字符为单位读写文件,常用于读写文本,数字等类型的文件。
-
FileReader
类是Reader
子类InputStreamReader
的子类,因此FileReader
类即可以使用Reader
类的方法,也可以使用InputStreamReader
类的方法来创建对象。
FileReader的构造方法:
//根据文件名创建 FileReader
public FileReader(String name);
FileReader:
FileReader fr = new FileReader("temt.txt");
int c;
while((c = fr.read()) != -1) {//通过项目的默认码表一次读取一个字符
System.out.println((char)c);
}
fr.close();
-
FileWriter
类是Writer
子类OutputStreamWriter
类的子类,因此FileWriter
类既可以使用Writer
类的方法也可以使用OutputStreamWriter
类的方法。
FileWriter的构造方法:
//根据文件名创建一个可写入的输出流对象
public FileWriter(String name);
//a 为真,数据将追加在文件后面
public FileWriter(String name, Boolean a);
看下面的例子:
FileWriter:
FileWriter fw = new FileWriter("temp.txt");
fw.write("大家好");
fw.close();
BufferedReader 和 BufferedWriter
-
BufferedReader
类是用来读取缓冲区中的数据。使用时必须创建FileReader
类对象,再以该对象为参数创建BufferedReader
类的对象。
BufferedReader
的构造方法:
//创建默认缓冲区大小的字符输入流
public BufferedReader(Reader in);
//创建指定缓冲区大小的字符输入流
public BufferedReader(Reader in, int size);
-
BufferedWriter
类是用来将数据写入到缓冲区。使用时必须先创建FileWriter
类对象,再以该对象为参数创建BufferedWriter
类对象,最后需要用flush()
方法将缓冲区清空。
BufferedWriter
的构造方法:
//创建缓冲区字符输出流
public BufferedWriter(Writer out);
//创建缓冲区字符输出流并设置缓冲区大小
public BufferedWriter(Writer out, int size);
看下面的代码:
BufferedReader br = new BufferedReader(new FileReader("temp.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("temp.txt"));
String line;
while((line = br.readLine()) != null) {//readLine()可以获取到一行的文字
bw.write(line);
bw.newLine();//写出回车还行符
}
br.close();
bw.close();
注意: 调用 bw 对象的 write()
写入数据时,不会写入回车,因此需要使用 newLine()
方法再每行数据后加入回车,以保证目标文件和源文件相一致。
LineNumberReader
使用这个类可以获取行号或者添加行号
LineNumberReader lnr = new LineNumberReader(new FileReader("temp.txt"));
String line;
lnr.setLineNumber(100);//设置行号
while((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + line);//getLineNumber() 获取行号
}