Java BufferedInputStream和BufferedOutputStream类的用法(附带实例)
Java 中的 BufferedInputStream 和 BufferedOutputStream 称为字节缓存流,它们本身并不具有输入/输出流的读取与写入功能,只是在其他流上加上缓存功能提高效率,就如同把其他流包装起来一样。
因此,缓存流是一种处理流(装饰流),当对文件或其他数据源执行频繁的读/写操作时,效率比较低,这时如果使用缓存流就能够更高效地读/写信息。
使用字节缓存流内置一个缓存区,第一次调用 read() 方法时尽可能将数据源的数据读取到缓存区中,后续再用 read() 方法时先确定缓存区中是否有数据,若有则读取缓存区中的数据,若没有则再次从数据源读取数据到缓存区中,并从缓存区中返回一部分数据给 read() 方法的调用者,这样可以减少直接读数据源的次数。
通过输出流调用 write() 方法写入数据时,先将数据写入缓存区中,缓存区满了之后或手动刷新时再将数据写入数据目的地。使用缓存字节流可以减少输入/输出操作的次数,以提高效率。
BufferedInputStream 和 BufferedOutputStream 是字节缓存流,通过内部缓存数组来提高操作流的效率。
1) BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装,以达到性能的优化。BufferedInputStream 类有以下两个构造方法:
2) BufferedOutputStream 类可以对所有 OutputStream 类进行带缓存区的包装,以达到性能的优化。BufferedOutputStream 类也有两个构造方法:
【实例】利用缓存流从一个文件中读取数据,并写入另一个文件中。

图 1 运行结果
【实例】编写程序将字符 'a'、'b' 和 'c' 写入磁盘文件中,写入 10 万次(分别使用 FileOutputStream 类和 BufferedOutputStream 类,并对比两者的效率)。
因此,缓存流是一种处理流(装饰流),当对文件或其他数据源执行频繁的读/写操作时,效率比较低,这时如果使用缓存流就能够更高效地读/写信息。
使用字节缓存流内置一个缓存区,第一次调用 read() 方法时尽可能将数据源的数据读取到缓存区中,后续再用 read() 方法时先确定缓存区中是否有数据,若有则读取缓存区中的数据,若没有则再次从数据源读取数据到缓存区中,并从缓存区中返回一部分数据给 read() 方法的调用者,这样可以减少直接读数据源的次数。
通过输出流调用 write() 方法写入数据时,先将数据写入缓存区中,缓存区满了之后或手动刷新时再将数据写入数据目的地。使用缓存字节流可以减少输入/输出操作的次数,以提高效率。
BufferedInputStream 和 BufferedOutputStream 是字节缓存流,通过内部缓存数组来提高操作流的效率。
1) BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装,以达到性能的优化。BufferedInputStream 类有以下两个构造方法:
- BufferedInputStream(InputStream in):创建一个带 32 字节缓存区的缓存输入流。
- BufferedInputStream(InputStream in, int size):按指定的大小创建缓存区。
2) BufferedOutputStream 类可以对所有 OutputStream 类进行带缓存区的包装,以达到性能的优化。BufferedOutputStream 类也有两个构造方法:
- BufferedOutputStream(OutputStream out):创建一个新的缓存输出流,以将数据写入指定的底层输出流中,缓存区的大小为 8192 字节。
- BufferedOutputStream(OutputStream out, int size):创建一个新的缓存输出流,以便以指定大小的缓存区将数据写入指定的底层输出流中。
【实例】利用缓存流从一个文件中读取数据,并写入另一个文件中。
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