Java DataOutputStream对象在8192字节后刷新

Java DataOutputStream对象在8192字节后刷新,java,Java,我将一个Java变量声明为: RandomAccessFile file = new RandomAccessFile("path-to-file"); DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD()))); 问题是,在2048年引入整数(或8192字节)之后,如果我尝试写入另一个整数,则输出会在没有任何警告的情况下刷新到磁盘 经过

我将一个Java变量声明为:

RandomAccessFile file = new RandomAccessFile("path-to-file");
DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file.getFD())));
问题是,在2048年引入整数(或8192字节)之后,如果我尝试写入另一个整数,则输出会在没有任何警告的情况下刷新到磁盘

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

谁能告诉我哪种结构有这个限制,我怎样才能增加它


如果能找出为什么结构在没有被告知的情况下就刷新,而不是仅仅提出一个异常,那也很好

刷新的是
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));
int BUFFER_SIZE=;
DataOutputStream输出=新的DataOutputStream(新的BufferedOutputStream(新的FileOutputStream(file.getFD()),BUFFER_SIZE));
然而,这可能不是你想要的!
BufferedOutputStream
的目的就是将写操作排队并写入一个大数据块中(在刷新时),这大大提高了性能。当它冲水的时候一点问题都没有。只需确保它在您最后一次写入后刷新即可

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

刷新的是
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));
int BUFFER_SIZE=;
DataOutputStream输出=新的DataOutputStream(新的BufferedOutputStream(新的FileOutputStream(file.getFD()),BUFFER_SIZE));
然而,这可能不是你想要的!
BufferedOutputStream
的目的就是将写操作排队并写入一个大数据块中(在刷新时),这大大提高了性能。当它冲水的时候一点问题都没有。只需确保它在您最后一次写入后刷新即可

此外,我很确定您的
DataOutputStream
的64K限制是错误的
它本身将写入无限字节,但当编码为UTF-8时,它将只写入最大长度为64K的字符串。

它还包含已写入多少字节的计数器。显然,这个将在
Integer.MAX\u VALUE
写入字节后溢出,但这不重要

那么,为什么要在随机访问文件上使用缓冲输出蒸汽呢?是什么让您认为它会引发异常?缓冲的目的是提高效率-如果您试图使用它,以便在刷新数据之前可以显式停止数据写入,我建议您为此编写自己的流包装器。这是否意味着除了javadoc for BufferedOutputStream之外,它显然是负责缓冲的类?我找不到文档中提到的字节数。另外,我也不知道流在添加8k后刷新的原因。这就是为什么我在这里问这个问题。不管怎样,我得到了想要的答案。谢谢。那你为什么在随机访问文件上使用缓冲输出蒸汽呢?是什么让你认为它会引发异常?缓冲的目的是提高效率-如果您试图使用它,以便在刷新数据之前可以显式停止数据写入,我建议您为此编写自己的流包装器。这是否意味着除了javadoc for BufferedOutputStream之外,它显然是负责缓冲的类?我找不到文档中提到的字节数。另外,我也不知道流在添加8k后刷新的原因。这就是为什么我在这里问这个问题。不管怎样,我得到了想要的答案。谢谢,谢谢。我仍然没有在BufferedOutputStream的文档页面上找到它的默认缓冲区值,也没有在缓冲区已满时进行刷新的事实。@user2565010:我在文档中确实找不到这个值。。。但是通过JDK下载,您还可以获得源代码。只要把它们链接到你的IDE中,你只需点击一下就可以找到完整的源代码!(在IntelliJ中)@user2565010 Javadic清楚地表示“根据需要将nuffer刷新到底层输出流”。你这方面的误解真的没有任何借口。@EJP:是的,但是默认的缓冲区大小丢失了,这让我很惊讶。在构造函数中完全指定所有参数的另一个原因是,没有给出确切的默认大小,因为a)如果有关系,您将指定它b)最佳缓冲区大小在不同的系统上可能不同,如果在文档中指定,则无法轻松调整。谢谢。我仍然没有在BufferedOutputStream的文档页面上找到它的默认缓冲区值,也没有在缓冲区已满时进行刷新的事实。@user2565010:我在文档中确实找不到这个值。。。但是通过JDK下载,您还可以获得源代码。只要把它们链接到你的IDE中,你只需点击一下就可以找到完整的源代码!(在IntelliJ中)@user2565010 Javadic清楚地表示“根据需要将nuffer刷新到底层输出流”。你这方面的误解真的没有任何借口。@EJP:是的,但是默认的缓冲区大小丢失了,这让我很惊讶。在构造函数中完全指定所有参数的另一个原因是,没有给出确切的默认大小,因为a)如果有关系,您将指定它b)最佳缓冲区大小在不同的系统上可能不同,如果在文档中指定,则无法轻松调整。