2014-12-02 32 views
0

我有一個文件打開和編寫與EOFException類曾經在20-30次左右死機的情況,因爲該文件不可用因爲其他一些進程正在寫入。如何在同一個線程等待文件被寫入,以完成,所以我們可以使用它

我能趕上這個例外,然後以某種方式等待文件的寫入操作同步到結束,這樣我就可以遞歸方法?

File productJSON = getFileStreamPath("product" + "_" + getId() + ".json"); 
if (!productJSON.exists()) { 
    productJSON = getFileStreamPath("product" + ".json"); 
} 

InputStream jsonStringsFileInputStream; 
try { 
    jsonStringsFileInputStream = new FileInputStream(productJSON); 

    HashMap<String, Map> that = new JSONToProductParser().convertThisToThat(jsonStringsFileInputStream); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
+0

無法理解你的問題,你可以請ellobrate上的文件 – koutuk 2014-12-02 09:24:49

+0

讀/寫操作應該是同步的,以避免在多線程應用程序 – jhamon 2014-12-02 09:25:21

+0

將文件標記爲併發中的代碼同步。它將解決你的問題,在這種情況下,一次只能有一個線程能夠寫入它。 – 2014-12-02 09:25:59

回答

1

您可以打開it.This之前檢查寫訪問的文件與canWrite()方法來完成。

Oracle Docs - File # canWrite

還檢查了該解決的問題。它處理同步屬性。

Solved Question - Synchronized

+0

所以,我該怎麼辦,如果canWrite返回false?我是否繼續循環支票? 所以我使所有與該文件處理方法同步? – 2014-12-02 09:34:43

+0

您可以查詢嘗試的某個時間或金額,如果它不改變其狀態拋出一個異常,或根據其處理給你needs.Regarding同步,你可能想讀入到此:https://docs.oracle.com/javase /tutorial/essential/concurrency/syncmeth.html – cgew85 2014-12-02 09:41:50

-1

你可以使用一個處理程序,在代碼中引入延遲。

final Handler handler=new Handler(); 
handler.postdelayed(new Runnable(){ 
@override 
public void run(){ 
//Do something after 5 seconds....your code here 
    } 
},5000); 

寫的run方法

+0

這沒有工作,因爲當我調用相同的方法在處理程序中,代碼是開始這個​​方法其餘犯規等待第二次迭代,但那張代替 – 2014-12-02 09:33:26

相關問題