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
ICP备案:
公安联网备案: