天天看点

java文件读写之Writer/Reader策略

概述

本篇博客向大家介绍的是如何运用java中的Writer/Reader,即读写器,进行文件读写,也就是说明如何通过读写器将字符串写到文件中,以及怎么把文件中的内容以字符串的形式读出来。具体地,我会介绍关于读写器的一些内容。

读写器介绍

文件读写可以分为两个大类,一类是处理字节流,就是以字节为基本单位访问文件的;而另一类是处理字符流,就是以字符为基本单位访问文件的,读写器就是其中一种。输入输出流的类与读写器的类之间存在着一定的对应关系,如下表所示。它们使用的方法飞铲相似,只是读写器稍微具有一些文本文件的处理特性。

输入流与输出流 读写器
java.io.InputStream java.io.Reader
java.io.OutputStream java.io.Writer
java.io.FileInputStream java.io.FileReader
java.io.FileOutputStream java.io.FileWriter
java.io.BufferedInputStream java.io.BufferedFileReader
java.io.BufferedOutputStream java.io.BufferedFileWriter
java.io.PrintStream java.io.PrintWriter

层次关系图如下:

java文件读写之Writer/Reader策略

1、Reader和Writer

抽象类java.io.Reader和java.io.Writer规定了读写器的一些基本操作,用于文件读写。因为两者是抽象类,所以不能直接用new关键字来声明其实例对象,只能生成其子类的实例对象。

抽象类java.io.Reader的一些方法

方法 描述
public int read() throws IOException 从文件中读取一个字符。当返回值为-1时,表示到达文件的末尾
public int read(char[] cbuf) throws IOException 从文件中读取一串字符,并保存在字符数组中。返回值为读取的字符个数,当返回值为-1时,表示到达文件的末尾

抽象类java.io.Writer的一些方法

方法 描述
public Writer append(char c) throws IOException 将字符c添加到当前文件中
public void write(int c) throws IOException 将由参数c低16位组成的1个字符写入到当前文件中
public void write(char[] cbuf) throws IOException 将字符数组cbuf的各个字符写入到当前文件中
public void write(String str) throws IOException 将字符串str写入到当前文件中
public abstract void flush( ) throws IOException 强制输出,使得数据立即写入文件
public abstract void close( ) throws IOException 关闭当前字符流并释放与该字符流相关联的系统资源

2、FileReader和FileWriter

类java.io.FileReader和类java.io.FileWriter分别是抽象类java.io.Reader和java.io.Writer的子类。类java.io.FileReader兼容抽象类java.io.Reader的所有成员方法,可以进行读取字符和关闭字符流等操作。类java.io.FileWriter兼容抽象类java.io.Writer的所有成员方法,可以进行输出单个或多个字符、强制输出和关闭字符流等操作。

创建类java.io.FileReader的实例对象,可以通过其构造方法

public FileReader(String filename) throws FileNotFoundException

创建类java.io.FileWriter的实例对象,可以通过其构造方法

public FileWriter(String filename) throws IOException

3、BufferedReader和BufferedWriter

类java.io.BufferedReader和类java.io.BufferedWriter是带缓存的读写器类。这些带缓存的类通过缓存机制进一步增强了读写器读取和存储数据的效率。类java.io.BufferedReader继承抽象类java.io.Reader的所有成员方法,可以进行读取字符和关闭字符流等操作。类java.io.BufferedWriter继承抽象类java.io.Writer的所有成员方法,可以进行输出单个或多个字符、强制输出和关闭字符流等操作。

创建类java.io.BufferedReader的实例对象,可以通过其构造方法

public BufferedReader(Reader in)

来实现,其中,参数in是指定字符流,通常是类java.io.FileReader的实例对象。

创建类java.io.BufferedWriter的实例对象,可以通过其构造方法

public BufferedWriter(Writer out)

来实现,其中,参数out是指定字符流,通常是类java.io.FileWriter的实例对象。

类java.io.BufferedReader额外的读取方法

方法 描述
public String readLine( ) throws IOException 从当前字符流中读取一行字符,并以字符串的形式返回。当遇到文件结束时,返回值为null

类java.io.BufferedWriter额外的写入方法

方法 描述
public void newLine( ) throws IOException 给文件中写入行分隔符。不同的操作系统往往采用不同的行间分隔符,常见的如:"\n"和"\r\n"。该方法可以根据当前的操作系统产生对应的行分隔符

Writer/Reader策略主要思想

根据上面的介绍,我们的大体思路是利用带缓存的读写器进行读写,因为它们的方法已经封装的很好了,而且效率也很高。

Writer/Reader策略实现方法

从文件中读:通过BufferedReader myRead = new BufferedReader(new FileReader(filename));建立对应文件的带缓存的读写器。然后我们利用类java.io.BufferedReader的readLine( )方法进行读文件即可。需要注意的是,这个方法每次读一行,所以文件内容有多行或者不确定文件内容有多少行的时候应该反复读取。

往文件中写:通过BufferedWriter myWriter = new BufferedWriter(new FileWriter(filename));建立对应文件的带缓存的读写器。然后我们利用类java.io.BufferedWriter的write(String str)方法进行写文件即可。

代码展示

package readandwrite;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class WriterandReader {
  public String myread(String filename) throws Exception {
    // TODO 自动生成的方法存根
    long starttime = System.currentTimeMillis();
    StringBuilder restfile = new StringBuilder();
    String temp = "";
    BufferedReader myRead;
    try {
      myRead = new BufferedReader(new FileReader(filename));
      while ((temp = myRead.readLine()) != null) {
        restfile.append(temp);
      }
      myRead.close();
    } catch (FileNotFoundException e) {
      // TODO 自动生成的 catch 块
      throw new Exception(e.toString());
    } catch (IOException e) {
      // TODO 自动生成的 catch 块
      throw new Exception(e.toString());
    }
    long endtime = System.currentTimeMillis();
    System.out.println("Reader/Writer策略读文件花费了:" + (endtime - starttime) + "ms");
    return restfile.toString();
  }

  public void mywrite(String outString, String filename) throws Exception {
    // TODO 自动生成的方法存根
    long starttime = System.currentTimeMillis();
    BufferedWriter myWriter;
    try {
      myWriter = new BufferedWriter(new FileWriter(filename));
      myWriter.write(outString);
      myWriter.close();
    } catch (FileNotFoundException e) {
      // TODO 自动生成的 catch 块
      System.err.println(e.toString());
    } catch (IOException e) {
      // TODO 自动生成的 catch 块
      System.err.println(e.toString());
    }
    long endtime = System.currentTimeMillis();
    System.out.println("Reader/Writer策略写文件花费了:" + (endtime - starttime) + "ms");
  }
  
  public static void main(String[] args) {
    String outfilename = "src\\txt\\cd.txt";
    String outString = "This is myWriter/Reader strategy!";
    WriterandReader myWriterandReader = new WriterandReader();
    try {
      myWriterandReader.mywrite(outString, outfilename);
      System.out.println(myWriterandReader.myread(outfilename));
    } catch (Exception e) {
      // TODO 自动生成的 catch 块
      e.printStackTrace();
    }
  }
}

           

运行结果

java文件读写之Writer/Reader策略