1 基本概括
2 主要介绍
2.1 FileReader和FileWriter基本介绍
FileReader
“文件字符输入流”,一般用于读取文本形式的文件,也可以用来读取字节形式文件,但是乱码问题依然不能完全避免。
FileWriter
”文件字符输出流”,一般用于写出本形式的文件,也可以用来写出字节形式文件,但是乱码问题依然不能完全避免。
2.2 FileReader和FileWriter原理
FileReader能够完成字符的读取操作主要是依赖InputStreamReader完成的,而InputStreamReader能够完成字符的读取主要的依赖StreamDecoder完成的。
字符读取流关系结构图:
FileWriter能够完成字符的读取操作主要是依赖OutputStreamReader完成的,而OutputStreamReader能够完成字符的读取主要的依赖StreamEncoder完成的。
字符写出流关系结构图:
3 用例
3.1 进行文件的拷贝
@ Test
public void IOTest01() throws Exception{
FileReader fr = new FileReader("D:\test01.txt");
FileWriter fw = new FileWriter("D:\test01.txt");
char[] cbuf = new char[1024];
int len;
while((len = fr.read(cbuf)) != -1){
fw.write(cbuf, 0, len);
}
fw.close();
fr.close();
}
3.2 将内容追加到文件
@Test
public void IOTest02() throws Exception{
FileWriter fw = new FileWriter("D:\test.txt",true);
fw.write("Hello world!");
fw.close();
}
3.3 读取文件内容
@Test
public void IOTest03() throws Exception{
FileReader fr = new FileReader("D:\test.txt");
char[] cbuf = new char[1024];
int len;
while((len = fr.read(cbuf)) != -1){
System.out.println(new String(cbuf,0,len));
}
fr.close();
}
4 源码分析
4.1 FileWriter
package com.chy.io.original.code;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* 文件字符输出流、与国际接轨、创建了此流。
* 仅仅是提供四个构造方法、还是调用OutputStreamWriter的默认编码的构造方法。
* 所以FileWriter使用的方法本质都是通过OutputStreamWriter将FileOutputStream传递给StreamEncoder来内部操作字节。给我们展现的则是操作字符。
*/
public class FileWriter extends OutputStreamWriter {
/**
* 调用 OutputStream Writer默认编码的构造方法构造FileWriter流。此流是在指定目的地中替换原有内容
* 从方法也可以看出、是对FileOutputStream的包装。
*/
public FileWriter(String fileName) throws IOException {
super ( new java.io.FileOutputStream(fileName));
}
/**
* 调用OutputStreamWriter默认编码创建FileWriter。此流通过传入的append值决定是否目的地中原有内容替换
*/
public FileWriter(String fileName, boolean append) throws IOException {
super ( new java.io.FileOutputStream(fileName, append));
}
/**
* 调用OutputStreamWriter默认编码的构造方法构造FileWriter流。此流是在指定目的地中替换原有内容
*/
public FileWriter(File file) throws IOException {
super ( new java.io.FileOutputStream(file));
}
/**
* 调用OutputStreamWriter默认编码的构造方法构造FileWriter流。此流通过传入的append值决定是否目的地中原有内容替换
*/
public FileWriter(File file, boolean append) throws IOException {
super ( new java.io.FileOutputStream(file, append));
}
/**
* 调用OutputStreamWriter默认编码创建FileWriter。此流通过传入的append值决定是否目的地中原有内容替换
*/
public FileWriter(FileDescriptor fd) {
super ( new java.io.FileOutputStream(fd));
}
}
4.2 FileReader
package com.chy.io.original.code;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
/**
*创建一个文件字符流。本质是用OutputStreamWriter、StreamEncoder对 File InputStream进行装饰。
*
*
*/
public class FileReader extends InputStreamReader {
/**
* 与FileWriter对称、调用父类InputStreamReader默认编码的构造器、及FileInputStream来构造FileReader。
*/
public FileReader(String fileName) throws FileNotFoundException {
super ( new FileInputStream (fileName));
}
/**
* 根据File创建一个FileReader
*/
public FileReader(File file) throws FileNotFoundException {
super ( new FileInputStream(file));
}
/**
* 根据FileDescriptor创建。
*/
public FileReader(FileDescriptor fd) {
super ( new FileInputStream(fd));
}
}