java io系列22之 FileReader和FileWriter

来源:互联网 发布:时尚杂志推荐 知乎 编辑:程序博客网 时间:2024/06/05 01:56

本文摘抄至 : 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

0 0
原创粉丝点击