您可以为BufferedOutputStream构造函数提供一个整型参数作为缓冲区大小。在我的szenario中,我有一个写入磁盘的进程和一个从磁盘读取的进程。具有8192字节的默认缓冲区会导致大文件高度碎片化。
现在我在想,如果我将缓冲区大小提高到1Mb,是否可以减少碎片。
我想这应该行得通。但是,如果我总是调用BufferedOutputStream.write(smallBuffer,0,i); // i being smaller than 8192,BufferedOutputStream还会尊重我的缓冲区吗
我是小的,因为我在网络上捕获小的包(8192字节)。但是我希望BufferedOutputStream真的缓冲很多,而不是决定更早地刷新?
BufferedOutputStream是否“愚蠢”到要等到缓冲区已满或flush()被调用。或者它安装了一些基于时间的刷新机制?
发布于 2011-06-09 01:07:24
BufferedOutputStream不使用任何基于时间的算法或其他统计信息在内部调用刷新。一旦缓冲区满了,或者你明确地刷新它(或者在缓冲流关闭之前),它就会刷新。
换句话说:更大的缓冲区大小将减少您的用例的碎片。
发布于 2011-06-09 01:07:49
根据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(),如果需要,你必须手动调用,而且缓冲区还没有填满。
https://stackoverflow.com/questions/6282386
复制相似问题