本文摘抄至 : skywang12345
摘要 : FileReader文件字符输入流、用于将文件内容以字符形式读取出来、一般用于读取字符形式的文件内容、也可以读取字节形式、实际上就是 调用父类(InputStreamReader)的 默认编码读取方法。FileWriter 文件字符输出流、主要用于将字符写入到指定的打开的文件。其实就是调用父类(OutputStreamWriter)默认编码函数。由于编码不可控,使用不是太灵活。
FileReader 是用于读取字符流的类,它继承于 InputStreamReader。要读取原始字节流,请考虑使用 FileInputStream。
FileWriter 是用于写入字符流的类,它继承于OutputStreamWriter。要写入原始字节流,请考虑使用 FileOutputStream。
FileReader和FileWriter源码分析
1. FileReader 源码(基于jdk1.7.40
package java.io;
public class FileReader extends InputStreamReader {
//在给定从中读取数据的文件名的情况下创建一个新 FileReader。
public FileReader(String fileName) throws FileNotFoundException {
super(new FileInputStream(fileName));
}
//在给定从中读取数据的 File 的情况下创建一个新 FileReader。
public FileReader(File file) throws FileNotFoundException {
super(new FileInputStream(file));
}
//在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
public FileReader(FileDescriptor fd) {
super(new FileInputStream(fd));
}
}
从中,我们可以看出FileReader是基于InputStreamReader实现的。
2. FileWriter 源码(基于jdk1.7.40)
package java.io;
public class FileWriter extends OutputStreamWriter {
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
public FileWriter(String fileName, boolean append) throws IOException {
super(new FileOutputStream(fileName, append));
}
public FileWriter(File file) throws IOException {
super(new FileOutputStream(file));
}
public FileWriter(File file, boolean append) throws IOException {
super(new FileOutputStream(file, append));
}
public FileWriter(FileDescriptor fd) {
super(new FileOutputStream(fd));
}
}
从中,我们可以看出FileWriter是基于OutputStreamWriter实现的。
示例程序
public class FileReaderWriterTest {
private static final String FileName = "file.txt";
private static final String CharsetName = "utf-8";
public static void main(String[] args) {
testWrite();
testRead();
}
private static void testWrite() {
try {
// 创建文件“file.txt”对应File对象
File file = new File(FileName) ;
// 创建FileOutputStream对应FileWriter:将字节流转换为字符流,
//即写入out1的数据会自动由字节转换为字符。
FileWriter out1 = new FileWriter(file) ;
// 写入10个汉字
out1.write("字节流转为字符流示例");
// 向“文件中”写入"0123456789"+换行符
out1.write("0123456789\n");
out1.close();
} catch (Exception e) {
e.printStackTrace() ;
}
}
private static void testRead() {
try {
// 方法1:新建FileInputStream对象
// 新建文件“file.txt”对应File对象
File file = new File(FileName);
FileReader in1 = new FileReader(file);
// 测试read(),从中读取一个字符
char c1 = (char)in1.read();
System.out.println("c1="+c1);
// 测试skip(long byteCount),跳过4个字符
in1.skip(6);
// 测试read(char[] cbuf, int off, int len)
char[] buf = new char[10];
in1.read(buf, 0, buf.length);
System.out.println("buf="+(new String(buf)));
in1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
c1=字
buf=流示例0123456