天天看点

Java IO流之FileWriter和FileReader分析

简介

FileWriter和FileReader写入和读取字符文件的便捷类.

FileWriter继承父类OutputStreamWriter,构造方法会访问父类中默认编码方式的构造方法,其他的方法完全继承自父类,没有对父类的方法进行重写.而FileReader继承父类InputStreamReader,同样构造方法会访问父类默认编码方法的的构造方法,其他方法也完全继承自父类.如需要指定编码方式,需要OutputStreamWriter和FileOutputStream,InputStreamReader和FileInputStream配合使用.

FileWriter介绍

1.构造方法

public FileWriter(String fileName) throws IOException {}
public FileWriter(String fileName, boolean append) throws IOException {}
public FileWriter(File file) throws IOException {}
public FileWriter(File file, boolean append) throws IOException {}
public FileWriter(FileDescriptor fd) {}
           
  • 有参构造方法,创建的是指定了文件名称fileName的FileWriter流,默认编码方式.
  • 有参构造方法,创建的是指定了文件名称和默认编码方式的FileWriter流,append表示的是是否追到文件末尾,false表示的是覆盖fileName文件.
  • 有参构造方法,创建的是File文件对象的FileWriter流,默认编码方式.
  • 有参构造方法,创建的是File文件对象和默认编码方式的FileWriter流,append表示的是追加到文件末尾,false表示的是覆盖fileName文件.
  • 有参构造方法,创建与文件描述符关联的FileWriter流.

FileReader介绍

1.构造方法

public FileReader(String fileName) throws FileNotFoundException {}
public FileReader(File file) throws FileNotFoundException {}
public FileReader(FileDescriptor fd) {}
           
  • 有参构造方法,创建的是指定文件名称fileName的FileReader流.默认编码方式.
  • 有参构造方法,创建的是指定file对象的FileReader流,默认编码方式.
  • 有参构造方法,创建与文件描述符关联的FileReader对象.

案例

public class FileReaderAndWriterDemo {
  public static void main(String[] args) throws IOException {
    String fileName= "D:\\java.txt";
    testFileWriter(fileName);
    testFileReader(fileName);
  }
  
  private static void testFileWriter(String fileName) throws IOException {
    FileWriter fw = new FileWriter(fileName);
    fw.write("helloworld");
    fw.write("\n");
    fw.write('a');
    fw.write(Integer.toString(12456));//写入非字符,需要转化
    fw.close();
  }
  
  private static void testFileReader(String fileName) throws IOException {
    FileReader fr = new FileReader(fileName);
    char cbuf[] = new char[1024];
    while(fr.read(cbuf)!=-1) {
      System.out.println(cbuf);
    }
    fr.close();
  }
}
           

运行结果:

helloworld

a12456

源码分析

1.FileWriter源码分析

public class FileWriter extends OutputStreamWriter {

  //有参构造方法,创建的是指定了文件名称fileName的FileWriter流,默认的编码方式.
  public FileWriter(String fileName) throws IOException {
      super(new FileOutputStream(fileName));
  }

  //有参构造方法,创建的是指定了文件名称和默认编码方式的FileWriter流,append表示的是是否追到文件末尾,false表示的是覆盖fileName文件.
  public FileWriter(String fileName, boolean append) throws IOException {
      super(new FileOutputStream(fileName, append));
  }

  //有参构造方法,创建的是File文件对象的FileWriter流,默认编码方式.
  public FileWriter(File file) throws IOException {
      super(new FileOutputStream(file));
  }

  //有参构造方法,创建的是File文件对象和默认编码方式的FileWriter流,append表示的是追加到文件末尾,false表示的是覆盖fileName文件.
  public FileWriter(File file, boolean append) throws IOException {
      super(new FileOutputStream(file, append));
  }

  //有参构造方法,创建与文件描述符关联的FileWriter流.
  public FileWriter(FileDescriptor fd) {
      super(new FileOutputStream(fd));
  }
}
           

2.FileReader源码分析

public class FileReader extends InputStreamReader {

    //有参构造方法,创建的是指定文件名称fileName的FileReader流.默认编码方式.
   public FileReader(String fileName) throws FileNotFoundException {
       super(new FileInputStream(fileName));
   }

  //有参构造方法,创建的是指定file对象的FileReader流,默认编码方式.
   public FileReader(File file) throws FileNotFoundException {
       super(new FileInputStream(file));
   }

   //有参构造方法,创建与文件描述符关联的FileReader对象.
   public FileReader(FileDescriptor fd) {
       super(new FileInputStream(fd));
   }
}
           

总结

FileWriter与FileReader分别继承自OutputStreamWriter和InputStreamReader.构造方法会访问到父类的默认编码方式的构造方法,其他方法全部继承父类,没有重写.如果想要需要指定编码方式,需要父类的OutputStreamWriter和FileOutputStream,InputStreamReaader和FileInputStream配合使用.

继续阅读