2013-09-26 23 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