提示

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 方法,确保缓冲数组中的剩余数据全部写入到流中。