概述

字符流是针对字符数据的特点进行过优化的,因而提供了一些面向字符的有用特性,字符流的源或目标通常是文本文件。 ReaderWriter是 java.io 包中所有字符流的父类。由于它们都是抽象类,所以应该使用它们的子类来创建实体对象,利用对象来处理相关的读写操作。 ReaderWriter 的子类又可以分为两大类:一类用来从数据源读入数据或往目的地写出数据(节点流),另一类对数据执行某种处理(处理流)。

一个值得注意的小知识点是:Java 把一个汉字或一个英文字母作为一个字符对待,回车或换行作为两个字符对待。

Reader

Reader 类的层次结构图:

java tab 用字符_输入流

Reader 的主要子类及说明

类名

功能描述

ByteArrayReader

从字节数组读取的输入流

CharArrayReader

从字符数组读取的输入流

PipedReader

输入管道

InputStreamReader

将字节转换到字符 的输入流

FilterReader

过滤输入流

StringReader

从字符串读取的输入流

LineNumberReader

为输入流附加行号

PushbackReader

返回一个字符并把此字节放回输入流

FileReader

从文件读取的输入流

Reader 提供的方法

方法

功能描述

void close()

关闭输入流

void mark()

标记输入流的当前位置

boolean markSupported()

测试输入流是否支持 mark

int read()

从输入流中读取一个字符

int read(char[] ch)

从输入流中读取字符数组

int read(char[] ch, int off, int len)

从输入流中自 off 下标开始读取 len 长度的字符到 ch 内

boolean ready()

测试流是否可以读取

void reset()

重定位输入流

long skip(long n)

跳过流内的 n 个字符

Writer

Writer 类的层次结构图:

java tab 用字符_输入流_02

Writer 的主要子类及其说明

类名

功能说明

CharArrayWriter

写到字符数组的输出流

BufferedWriter

缓冲输出字符流

PipedWriter

输出管道

OutputStreamWriter

转换字符到字节 的输出流

FilterWriter

过滤输出流

StringWriter

输出到字符串 的输出流

PrintWriter

包含 print()println()的输出流

FileWriter

输出到文件 的输出流

Writer 提供的方法

方法

功能描述

void close()

关闭输出流

void flush()

将缓冲区中的数据写到文件中

void write(int c)

将单一字符 c 输出到流中

void write(String str)

将字符串 str 输出到流中

void write(char[] ch)

将字符数组 ch 输出到流中

void write(char[] ch, int offset, int length)

将一个数组内字 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() 获取行号
}