2013-09-26 27 views
0

我有宣布为Java变量:Java的DataOutputStream类对象刷新8192个字节

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

的问题是,2048之后推出的整数(或8192个字节),如果我尝试写一个又一个,输出会在没有任何警告的情况下刷新到磁盘。

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

任何人都可以告诉我哪个结构有这个限制,我该如何增加它?

这也很好找到为什么结构刷新而不被告知而不是仅仅引发异常?

+0

那么,为什么你在随机访问文件上使用缓冲输出流? –

+4

是什么让你觉得它会引发异常?缓冲的目的是为了提高效率 - 如果你试图使用它,这样你就可以明确地停止写入数据,直到你刷新它,我建议你写一个你自己的流封装器。 –

+1

除了用于BufferedOutputStream的javadoc之外,它显然是负责缓冲的类? –

回答

3

这是BufferedOutputStream谁冲,其默认大小为:

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)); 

但是,这可能不是你想要的! 队列写入并将它们写入一个大块(在flush中)是BufferedOutputStream的目的,并且它大大提高了性能。冲洗时根本不是问题。只要确保在你最后一次写入之后它就会被刷新。

另外,我敢肯定你得到了64K限制的DataOutputStream错!
本身会写入无限制的字节,但是它只会编写最大长度为64K的字符串,当编码为UTF-8时。 它还包含一个计数器已经写入了多少个字节。很明显,这个在Integer.MAX_VALUE写入字节后会溢出,但这应该不重要!

+0

谢谢。尽管如此,我还是没有在BufferedOutputStream的文档页面找到它的默认缓冲区值,也没有在缓冲区满时刷新它的事实。 – user2565010

+0

@ user2565010:我确实在文档中找不到那个文件......但是,通过JDK下载,您还可以获得源文件。只需将它们链接到您的IDE中,只需一个 + 点击完整源代码! (在IntelliJ中) – tilpner

+1

@ user2565010 Javadic明确指出'必要时将底层输出流*刷新*'。这种误解实在没有借口。 – EJP