我正在声明一个Java变量:
RandomAccessFile file = new RandomAccessFile("path-to-file");
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD())));
问题是在2048引入整数(或8192字节)之后,如果我尝试写另一个整数,输出会在没有任何警告的情况下刷新到磁盘。
经过一些研究后我发现DataOutputStream有64k的限制,我找不到任何关于BufferedOutputStream或FileOutputStream的官方消息。
有人可以告诉我哪种结构有此限制,我该如何增加它?
找出为什么结构在没有被告知的情况下刷新而不是仅仅引发异常也是很好的?
答案 0 :(得分: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
的目的,它大大提高了性能。冲洗时根本不是问题。只需确保在上次写完后它就会刷新。
此外,我很确定你的DataOutputStream
错误的64K限制!
它本身会写入无限的字节,但是当编码为UTF-8时,它只会写入最大长度为64K的字符串。
它还包含一个计数器已写入的字节数。显然,在Integer.MAX_VALUE
写入的字节后,这个会溢出,但这不重要!