提示
Java IO BufferedOutputStream 使用示例。@ermo
# BufferedOutputStream 使用示例
BufferedOutputStream
是装饰类,继承类 FilterOutputStream
,提供类缓冲功能。
普通的 FileOutputStream
是进行单字节写入的,性能比较慢。
BufferedOutputStream
的主要构造器有2个:
public BufferedOutputStream(OutputStream out)
public BufferedOutputStream(OutputStream out, int size)
默认的缓冲数组是8192个字节,也可以使用第二个构造器自定义缓冲数组的大小。
写的过程是先将缓冲数组中的数据写入输出流,缓冲数组中没有数据时,再调用包装的输出流的 write
方法进行写操作。
看一个简单的例子:
public static void writeFile() throws IOException {
String filepath = "src/main/resources/order2.txt";
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filepath));
String data = "Some text for output file.";
out.write(data.getBytes());
out.flush();
out.close();
}
public static void main(String[] args) throws IOException {
writeFile();
}
打开 order2.txt 文件,可以看到输出的内容:
Some text for output file.
在使用 FileOutputStream
的时候,应该习惯性的使用 BufferedOutputStream
进行装饰,可以提高程序的性能。
再来看一个简单示例:
public static void write() throws IOException {
String filepath = "src/main/resources/order1.txt";
Order o1 = new Order("123", 1, 10.5);
Order o2 = new Order("456", 2, 30.5);
List<Order> orders = Arrays.asList(o1, o2);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(filepath)));
try {
out.writeInt(orders.size());
for (Order order : orders) {
out.writeUTF(order.getOrderNo());
out.writeInt(order.getOrderType());
out.writeDouble(order.getOrderAmount());
}
} finally {
out.close();
}
}
public static void main(String[] args) throws IOException {
write();
}
多个装饰类可以组合使用,比如上例中的 DataOutputStream
本身就是一个装饰类,可以使用构造器创建一个具有缓存功能的 DataOutputStream
实例。
在调用 write
的时候,实际调用的是 BufferedOutputStream
的覆写 write
方法。
需要注意的是,使用缓冲输出流,应该再最后调用 flush
方法,确保缓冲数组中的剩余数据全部写入到流中。