首页 > 编程笔记 > Java笔记 阅读:5

Java中的FileReader和FileWriter(附带实例)

Java 提供了大量与“流”操作和处理相关的类。它们把数据传送的细节封装起来。利用这些类编程,程序员就可以不用考虑底层设备及操作系统的细节。

Java 中的“流”类位于 java.io 包或 java.nio 包中,其中 Reader 和 Writer 类的层次结构如下图所示。


图 1 I/O流类的层次结构图

Java Reader和Writer

在很多应用环境中,Java 程序中读取的是文本数据内容,文本文件中存放的都是字符。在 Java中,字符采用 Unicode 编码,每一个字符占用 2 个字节的空间。

为了方便读取以字符为单位的数据文件,Java 提供了 Reader 类。它是所有字符输入流的基类。它是抽象类,不能直接进行实例化。

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 提供多个成员方法,分别用来输出单个字符,字符数组和字符串。

表: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 类有两个构造方法:
相对来说,第一种方法使用更方便一些。构造一个输入流,并以文件为输入源。第二种方法构造一个输入流,并使 File 的对象 f 和输入流相连接。

FileReader 类的最重要的方法也是 read(),返回下一个输入字符的整型表示。

FileWriter 是 OutputStreamWriter 的直接子类,用于向文件中写入字符。此类的构造方法以默认字符编码和默认字节缓冲区大小来创建实例。

FileWriter 有两个构造方法:
第一种构造方法用文件名的字符串作为参数,第二种方法以一个文件对象作为参数

【实例】使用 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();
        }
    }
}
运行该程序后,打开目标文件,会发现内容和源文件相同。

相关文章