Java中的FileReader和FileWriter(附带实例)
Java 提供了大量与“流”操作和处理相关的类。它们把数据传送的细节封装起来。利用这些类编程,程序员就可以不用考虑底层设备及操作系统的细节。
Java 中的“流”类位于 java.io 包或 java.nio 包中,其中 Reader 和 Writer 类的层次结构如下图所示。

图 1 I/O流类的层次结构图
为了方便读取以字符为单位的数据文件,Java 提供了 Reader 类。它是所有字符输入流的基类。它是抽象类,不能直接进行实例化。
Reader 类提供的方法如下表所示:
Writer 类是处理所有字符输出流类的基类。它是抽象类,不能直接进行实例化。Writer 提供多个成员方法,分别用来输出单个字符,字符数组和字符串。
FileReader 类可以在一指定文件上实例化一个文件输入流,利用流提供的方法从文件中读取一个字符或者一组数据。由于汉字在文件中占用两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这种现象。
FileReader 类有两个构造方法:
相对来说,第一种方法使用更方便一些。构造一个输入流,并以文件为输入源。第二种方法构造一个输入流,并使 File 的对象 f 和输入流相连接。
FileReader 类的最重要的方法也是 read(),返回下一个输入字符的整型表示。
FileWriter 是 OutputStreamWriter 的直接子类,用于向文件中写入字符。此类的构造方法以默认字符编码和默认字节缓冲区大小来创建实例。
FileWriter 有两个构造方法:
第一种构造方法用文件名的字符串作为参数,第二种方法以一个文件对象作为参数
【实例】使用 FileReader 和 FileWriter 把源文件“d:\source.txt”中的内容复制到目标文件“d:\dest.txt”中。
Java 中的“流”类位于 java.io 包或 java.nio 包中,其中 Reader 和 Writer 类的层次结构如下图所示。

图 1 I/O流类的层次结构图
Java Reader和Writer
在很多应用环境中,Java 程序中读取的是文本数据内容,文本文件中存放的都是字符。在 Java中,字符采用 Unicode 编码,每一个字符占用 2 个字节的空间。为了方便读取以字符为单位的数据文件,Java 提供了 Reader 类。它是所有字符输入流的基类。它是抽象类,不能直接进行实例化。
Reader 类提供的方法如下表所示:
方法名 | 说明 |
---|---|
void close() | 关闭此输入流并释放与该流关联的所有系统资源 |
void mark(int readlimit) | 标记流中的当前位置,对 reset() 的后续调用将尝试将流重新定位到此位置。readlimit 参数限制仍然保留标记时可能读取的字符数 |
boolean markSupported() | 测试此输入流是否支持 mark 和 reset 方法 |
int read() | 读取一个字符,返回值为读取的字符 |
int read(char[] cbuf) | 从输入流中读取若干字符,并将其存储在字符数组中,返回值为实际读取的字符的数量 |
int read(char[] cbuf, int off, int len) | 读取 len 个字符,从数组 cbuf 的下标 off 处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现 |
void reset() | 将此流重新定位到最后一次对此输入流调用mark方法时的位置 |
long skip(long n) | 跳过和丢弃此输入流中数据的n个字符 |
Writer 类是处理所有字符输出流类的基类。它是抽象类,不能直接进行实例化。Writer 提供多个成员方法,分别用来输出单个字符,字符数组和字符串。
方法名 | 方法说明 |
---|---|
void write(int c) | 将整型值 c 的低 16 位写入输出流 |
void write(char cbuf[]) | 将字符数组 cbuf[] 写入输出流 |
void write(char cbuf[], int off, int len) | 将字符数组 cbuf[] 中从下标为 off 的位置处开始的 len 个字符写入输出流 |
void write(String str) | 将字符串 str 中的字符写入输出流 |
void write(String str, int off, int len) | 将字符串 str 中从下标 off 开始处的 len 个字符写入输出流 |
void flush() | 刷空输出流,并输出所有被缓存的字节 |
Java FileReader和FileWriter
因为大多数程序涉及文件读/写,所以 FileReader 类是一个经常用到的类。FileReader 类可以在一指定文件上实例化一个文件输入流,利用流提供的方法从文件中读取一个字符或者一组数据。由于汉字在文件中占用两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这种现象。
FileReader 类有两个构造方法:
- FileReader(String filename);
- FileReader(File f)。
相对来说,第一种方法使用更方便一些。构造一个输入流,并以文件为输入源。第二种方法构造一个输入流,并使 File 的对象 f 和输入流相连接。
FileReader 类的最重要的方法也是 read(),返回下一个输入字符的整型表示。
FileWriter 是 OutputStreamWriter 的直接子类,用于向文件中写入字符。此类的构造方法以默认字符编码和默认字节缓冲区大小来创建实例。
FileWriter 有两个构造方法:
- FileWriter(String filename);
- FileWriter(File f)。
第一种构造方法用文件名的字符串作为参数,第二种方法以一个文件对象作为参数
【实例】使用 FileReader 和 FileWriter 把源文件“d:\source.txt”中的内容复制到目标文件“d:\dest.txt”中。
import java.io.*; public class FileCopy { public static void main(String[] args) { File sourceFile = new File("d:\\source.txt"); File destFile = new File("d:\\dest.txt"); try { FileReader fr = new FileReader(sourceFile); FileWriter fw = new FileWriter(destFile); char[] buffer = new char[1024]; int length; while ((length = fr.read(buffer)) > 0) { fw.write(buffer, 0, length); } fr.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } }运行该程序后,打开目标文件,会发现内容和源文件相同。