首页 > 编程笔记 > Java笔记 阅读:4

Java缓存流的用法(附带实例)

为了提高数据读写速度,Java API 提供了带缓存功能的流类,称为缓存流。

缓存流“套接”在相应的节点流之上。根据数据操作单位,可以把缓存流分为以下两种类型:
在创建流对象时,内部会创建一个缓存区数组[缺省使用 8192 字节(8KB)的缓存区],通过缓存区读写,减少系统输入输出次数,从而提高读写效率,如下图所示。


图 1 缓存流

Java 缓存流的构造方法如下:
【实例】创建缓存流对象,调用不同的构造方法,创建不同的缓存流对象,代码如下:
import java.io.*;

public class BufferedInputStreamDemo {
    public static void main(String[] args) throws Exception {
        // 创建 FileInputStream 对象
        FileInputStream fileInputStream = new FileInputStream(new File("a.txt"));
        // 缓存流 BufferedInputStream 的参数需要的是 FileInputStream 对象
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream = new FileOutputStream("c.txt");
        // 缓存流 BufferedOutputStream 的参数需要的是 FileOutputStream 对象
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        FileReader fileReader = new FileReader("a.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        FileWriter fileWriter = new FileWriter("c.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    }
}
在上述代码中,我们创建了字节流的缓存流与字符流的缓存流,二者均属于处理流的范畴。通过调用不同的构造方法,我们能够创建出各具特色的缓存流,以满足不同的数据处理需求。

Java 缓存流的常用方法如下:
【实例】将文件 test.txt 复制到同一路径下,并更名为 newtest.txt,代码如下:
import java.io.*;

/**
* 复制 test.txt 文件,复制到同一个路径下,重命名为 newtest.txt 文件
*/
public class BufferedReadWriterDemo {
    public static void main(String[] args) {
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileReader = new FileReader("test.txt");
            fileWriter = new FileWriter("newtest.txt");
            bufferedReader = new BufferedReader(fileReader);
            bufferedWriter = new BufferedWriter(fileWriter);
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                bufferedWriter.write(line);
                bufferedWriter.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 先关闭后开的
                bufferedWriter.close();
                bufferedReader.close();
                fileWriter.close();
                fileReader.close();
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
    }
}
在上述代码中,采用缓存流通过逐行读取和写入文件来实现对数据的处理,将 test.txt 文件复制到同一路径下,并将其重命名为 newtest.txt。

注意,在涉及嵌套的多个流时,如果都要显式关闭的话,就需要先关闭外层的流,再关闭内层的流。实际上,在开发中,只要关闭最外层的流即可,因为在关闭外层的流时,内层的流也会被关闭。

相关文章