2015-09-07 167 views
0

我寫一個字符串到一個文件中,該字符串很長,大約100K,這裏是我的代碼:BufferedWriter將截斷字符串

public static void main(String[] args) throws IOException { 
    String s = "kkkk"; 

    BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/liaoliuqing/Downloads/1.txt",true),1024); 
    bw.write(s); 
    bw.flush(); 
    bw.close(); 
} 

當字符串短,效果很好。但是當字符串非常長時,字符串將被截斷,只有一些字符被寫入文件。

是什麼問題?

這是我的代碼,它可以在很多線程中使用。

private void writeToFile(String filterName, String messageToWrite) 
     throws IOException { 
    if(!messageToWrite.contains("2015")){ 
     LOG.warn(messageToWrite); 
    } 
    bufferWritter = getBufferWriter(filterName, messageToWrite); 
    bufferWritter.write(messageToWrite); 
    if(!messageToWrite.contains("2015")){ 
     LOG.warn(messageToWrite); 
    } 
    bufferWritter.flush(); 
} 

我很確定messageToWrite是完整的字符串,因爲我記錄它。但只是字符串的後半部分被寫入文件。

它在約10個線程中工作。

我發現這個問題。當一個線程正在寫入文件時,則是另一個線程運行的時候,第一個線程的內容會與第二個線程混淆。 我嘗試

returnWriter = new BufferedWriter(new FileWriter(fileName, true),64*1024); 

到incread的bufferwriter的緩衝區大小,但它不能正常工作。它仍然只向文件寫入8192(默認緩衝區大小)。 如何解決這個問題?

+4

嗯,我非常懷疑這是'BufferedWriter'的問題。我的猜測是,這與您查看文件的方式有關,但我們沒有足夠的信息來幫助您。你能製作一個簡短但完整的程序來證明問題嗎? –

+2

你確定你的字符串是完整的嗎?獲取字符串可能存在問題。我很難懷疑java會在這麼短的時間之後以這樣簡單的任務失敗。 –

+0

如果你試圖寫大於緩衝區大小的消息,我很確定它不工作,因爲你只寫'一次'。 – Fincio

回答

0

您需要確保一次只有一個線程可以使用緩衝寫入器。一個簡單的解決方案是使writeToFile方法同步。否則,你可以使用某種鎖定機制。您可以使用Object.wait/notify或使用java.util.concurrent包中的信號量。

+0

不只是一些線程,還有一些進程會寫入同一個文件。所以我似乎同步不起作用。 –

+0

如果你想要一個跨進程的鎖定機制,你需要尋找其他解決方案。一種典型的方式是使用文件作爲鎖。如果一個進程可以創建鎖文件,它會繼續並在最後刪除文件。所有進程都等待,直到他們可以創建文件。雖然我懷疑這個解決方案能幫助你。 – KDM