Java字符流FileReader和FileWriter的用法(附带实例)
在 Java 中,FileReader 是 Reader 类的子类,实现了从文件中读取字符数据,是文件字符输入流。该类所有的方法都是从 Reader 类继承的。
FileReader 类常用的构造方法如下。
和 FileReader 类相对的,是 FileWriter 类,常用的构造方法如下:
在创建输入/输出流时,如果文件不存在,就会抛出 FileNotFoundException 异常。
【实例】使用 FileReader 类与 FileWriter 类实现文本文件的复制。
需要注意的是,上述代码中使用的 buffer 字节数组是作为一个缓存数据的容器存在的。当每次调用 read() 方法时,都会从流中读取数组长度(实例中是 1024)个字符写入该数组缓存内,此时会从头开始覆盖数组中原有的内容。但是当流中剩余的数据小于数组长度时,仅读取剩余长度个字符写入该数组中。此时需要特别注意的是,该数组中的前半部分是本次写入的数据,而后半部分是上次写入操作遗留的数据。
在使用输出流的 write() 方法将数组中的数据写出时,必须指定 len,仅使用数组中本次写入的内容,避免输出上一次遗留的数据。
FileReader 类常用的构造方法如下。
① FileReader(File file) ② FileReader(String fileName)方法 ① 通过给定的 File 对象创建字符输入流;方法 ② 通过文件名字符串创建字符输入流。
和 FileReader 类相对的,是 FileWriter 类,常用的构造方法如下:
① FileWriter(File file) ② FileWriter(String fileName) ③ FileWriter(File file,boolean append) ④ FileWriter(String fileName,boolean append)
- 方法 ① 通过给定的 File 对象创建字符输出流;
- 方法 ② 通过文件名字符串创建字符输出流。
- 方法 ③ 通过给定的 File 对象创建字符输出流,若 append 值为 true,则将字符写到文件末尾处,而不是写到文件开始处。
- 方法 ④ 通过文件名字符串创建字符输出流,若 append 值为 true,则将字符写到文件末尾处,而不是写到文件开始处。
在创建输入/输出流时,如果文件不存在,就会抛出 FileNotFoundException 异常。
【实例】使用 FileReader 类与 FileWriter 类实现文本文件的复制。
import java.io.FileReader; import java.io.FileWriter; public class Example { public static void main(String[] args) { String inputPath = "D:\\Example.java"; String outputPath = "D:\\chapter\\back_Example.java"; try ( FileReader freader = new FileReader(inputPath); FileWriter fwriter = new FileWriter(outputPath); ) { char[] buffer = new char[1024]; int len = 0; while ((len = freader.read(buffer)) != -1) { fwriter.write(buffer, 0, len); } fwriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }运行程序,会将位于 D:\Example.java 的文件内容复制到 D:\chapter\back_Example.java 文件中。
需要注意的是,上述代码中使用的 buffer 字节数组是作为一个缓存数据的容器存在的。当每次调用 read() 方法时,都会从流中读取数组长度(实例中是 1024)个字符写入该数组缓存内,此时会从头开始覆盖数组中原有的内容。但是当流中剩余的数据小于数组长度时,仅读取剩余长度个字符写入该数组中。此时需要特别注意的是,该数组中的前半部分是本次写入的数据,而后半部分是上次写入操作遗留的数据。
在使用输出流的 write() 方法将数组中的数据写出时,必须指定 len,仅使用数组中本次写入的内容,避免输出上一次遗留的数据。