2014-12-02 31 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

相关问题