0

我有一个这样声明的Java变量:

RandomAccessFile file = new RandomAccessFile("path-to-file");
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD())));

问题是在 2048 引入整数(或 8192 字节)之后,如果我尝试写入另一个整数,输出会刷新到磁盘而没有任何警告。

经过一番研究,我发现 DataOutputStream 有 64k 的限制,我找不到任何关于 BufferedOutputStream 或 FileOutputStream 的官方信息。

谁能告诉我哪个结构有这个限制,我该如何增加它?

找出为什么结构在没有被告知而不是仅仅引发异常的情况下刷新也会很好吗?

4

1 回答 1

3

这是BufferedOutputStream谁刷新,其默认大小为8192

public BufferedOutputStream(OutputStream out) {
     this(out, 8192);
}

只需创建BufferedOutputStream一个描述所需缓冲区大小的秒参数!

int BUFFER_SIZE= <some value>;

DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD()), BUFFER_SIZE));

然而,这可能不是你想要的!排队写入并将它们写入一大块(在刷新时)是 的真正目的,BufferedOutputStream它大大提高了性能。冲水的时候一点问题都没有。只需确保它在您最后一次写入后刷新即可。

此外,我很确定您的 64K 限制是DataOutputStream错误的!
它本身将写入无限字节,但是当编码为 UTF-8 时,它只会写入最大长度为 64K 的字符串。它还包含一个计数器,已写入多少字节。显然这个会在Integer.MAX_VALUE写入字节后溢出,但这不重要!

于 2013-09-26T18:33:40.310 回答