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

Java BufferedInputStream和BufferedOutputStream类的用法(附带实例)

Java 中的 BufferedInputStream 和 BufferedOutputStream 称为字节缓存流,它们本身并不具有输入/输出流的读取与写入功能,只是在其他流上加上缓存功能提高效率,就如同把其他流包装起来一样。

因此,缓存流是一种处理流(装饰流),当对文件或其他数据源执行频繁的读/写操作时,效率比较低,这时如果使用缓存流就能够更高效地读/写信息。

使用字节缓存流内置一个缓存区,第一次调用 read() 方法时尽可能将数据源的数据读取到缓存区中,后续再用 read() 方法时先确定缓存区中是否有数据,若有则读取缓存区中的数据,若没有则再次从数据源读取数据到缓存区中,并从缓存区中返回一部分数据给 read() 方法的调用者,这样可以减少直接读数据源的次数。

通过输出流调用 write() 方法写入数据时,先将数据写入缓存区中,缓存区满了之后或手动刷新时再将数据写入数据目的地。使用缓存字节流可以减少输入/输出操作的次数,以提高效率。

BufferedInputStream 和 BufferedOutputStream 是字节缓存流,通过内部缓存数组来提高操作流的效率。

1) BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装,以达到性能的优化。BufferedInputStream 类有以下两个构造方法:
2) BufferedOutputStream 类可以对所有 OutputStream 类进行带缓存区的包装,以达到性能的优化。BufferedOutputStream 类也有两个构造方法:
【实例】利用缓存流从一个文件中读取数据,并写入另一个文件中。
import java.io.*;

public class Demo {
    public static void main(String[] args) {
        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        try {
            in = new BufferedInputStream(new FileInputStream(
                "D:\\chapter10\\Example10_10.java"));
            out = new BufferedOutputStream(new FileOutputStream(
                "D:\\chapter10\\back_Example10_10.java"));
            int b = in.read();
            while (b != -1) {
                out.write(b);
                b = in.read();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
运行结果如下图所示:


图 1 运行结果

【实例】编写程序将字符 'a'、'b' 和 'c' 写入磁盘文件中,写入 10 万次(分别使用 FileOutputStream 类和 BufferedOutputStream 类,并对比两者的效率)。
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Example {
    public static void main(String[] args) {
        // 使用 FileOutputStream 类写入
        try {
            FileOutputStream out1 = new FileOutputStream("D:\\chapter10\\1.txt");
            long starttime = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                out1.write('a');
                out1.write('b');
                out1.write('c');
            }
            out1.flush();
            out1.close();
            long endtime = System.currentTimeMillis();
            System.out.println("使用 FileOutputStream 类写入文件中的耗时:" + (endtime - starttime));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 使用 BufferedOutputStream 类写入
        try {
            BufferedOutputStream out2 = new BufferedOutputStream(new FileOutputStream("D:\\chapter10\\1.txt"));
            long starttime = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                out2.write('a');
                out2.write('b');
                out2.write('c');
            }
            out2.flush();
            out2.close();
            long endtime = System.currentTimeMillis();
            System.out.println("使用 BufferedOutputStream 类写入文件中的耗时:" + (endtime - starttime));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
运行结果如下:

使用 FileOutputStream 类写入文件中的耗时:655
使用 BufferedOutputStream 类写入文件中的耗时:15

由此可知,使用 BufferedOutputStream 类的耗时远远小于使用 FileOutputStream 类的耗时。

相关文章