Java BufferedOutputStream策略

时间:2011-06-08 16:53:30

标签: java process stream buffer disk

您可以为BufferedOutputStream构造函数提供缓冲区大小的int参数。我的szenario我有一个进程写入磁盘和从磁盘读取进程。拥有8192字节的默认缓冲区会导致大文件碎片化。

现在我想知道如果我将缓冲区大小提升到1 Mb,是否可以减少碎片。

我认为这应该有效。但如果我总是打电话,BufferedOutputStream是否仍然尊重我的缓冲区     BufferedOutputStream.write(smallBuffer,0,i); // i being smaller than 8192

我很小,因为我正在网上捕捉小的paketes(8192字节)。但是我希望BufferedOutputStream真正缓冲很多,而不是决定早些时候冲洗?

BufferedOutputStream“愚蠢”是否足以等到缓冲区已满或被调用flush()。或者是否安装了一些基于时间的冲洗机制?

2 个答案:

答案 0 :(得分:5)

BufferedOutputStream不使用任何基于时间的算法或其他统计信息来在内部调用flush。它会在缓冲区已满或冲洗后(或在缓冲流关闭之前)立即刷新。

换句话说:较大的缓冲区大小将减少用例的碎片。

答案 1 :(得分:5)

根据Javadoc

  

通常,此方法将来自给定数组的字节存储到此流的缓冲区中,根据需要将缓冲区刷新到基础输出流。

http://download.oracle.com/javase/6/docs/api/java/io/BufferedOutputStream.html

如果你看一下来源(Sun实施):

public synchronized void write(byte b[], int off, int len) throws IOException {
    //flushBuffer() if necessary
    System.arraycopy(b, off, buf, count, len);
    count += len;
}

仅当数据块大于整个缓冲区或者将其附加到缓冲区会导致溢出时才会发生flushBuffer()

快速回答:是的。并且没有隐式flush(),必须在必要时手动调用,缓冲区尚未填充。