Java BufferedOutputStream策略

Fra*_*fka 0 java buffer process disk stream

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

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

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

我很小,因为我正在网上捕捉小的paketes(8192字节).但我想要BufferedOutputStream真正缓冲很多,而不是决定先冲洗?

BufferedOutputStream "愚蠢的",足以等到缓冲区已满或者flush()被调用.或者它安装了一些基于时间的冲洗机制?

Seb*_*kow 5

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

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


Tom*_*icz 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;
}
Run Code Online (Sandbox Code Playgroud)

flushBuffer(),如果它附加到缓冲器将导致溢出只有在数据块是比整个缓冲器,就会发生或.

所以快点回答:是的.并且没有隐含的flush(),必须在必要时手动调用,缓冲区尚未填充.