首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BufferedOutputStream策略

Java BufferedOutputStream策略
EN

Stack Overflow用户
提问于 2011-06-09 00:53:30
回答 2查看 2.4K关注 0票数 0

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

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

我想这应该行得通。但是,如果我总是调用BufferedOutputStream.write(smallBuffer,0,i); // i being smaller than 8192BufferedOutputStream还会尊重我的缓冲区吗

我是小的,因为我在网络上捕获小的包(8192字节)。但是我希望BufferedOutputStream真的缓冲很多,而不是决定更早地刷新?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-09 01:07:24

BufferedOutputStream不使用任何基于时间的算法或其他统计信息在内部调用刷新。一旦缓冲区满了,或者你明确地刷新它(或者在缓冲流关闭之前),它就会刷新。

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

票数 5
EN

Stack Overflow用户

发布于 2011-06-09 01:07:49

根据Javadoc的说法

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

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

如果您查看源代码(Sun实现):

代码语言:javascript
复制
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(),如果需要,你必须手动调用,而且缓冲区还没有填满。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6282386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档