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

+0

операции чтения/записи на файле должны быть синхронизированы, чтобы избежать параллелизма в многопоточном приложении – jhamon

+0

Марк файл как синхронизированы. Это решит вашу проблему, в этом случае только один поток за раз сможет записать на него. –

ответ

1

Вы можете проверить файл для записи перед открытием .Така осуществляются с canWrite() методом.

Oracle Docs - File # canWrite

Также проверьте этот вопрос решен. Он имеет дело с синхронизированным атрибутом.

Solved Question - Synchronized

+0

Итак, что мне делать, если canWrite возвращает false? я продолжаю проверять чек? Так что я делаю все методы, связанные с этим файлом, синхронизированными? –

+0

Вы можете опросить определенное время или количество попыток, если он не изменит свой статус, исключит или обработает его в соответствии с вашими потребностями. Относительно синхронизации вы можете прочитать следующее: https://docs.oracle.com/javase /tutorial/essential/concurrency/syncmeth.html – cgew85

-1

Вы можете использовать обработчик ввести задержки в коде.

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

написать свой код в методе выполнения

+0

Это не сработало, потому что, когда я вызываю тот же метод из обработчика, остальная часть кода, который запустил этот метод, не ждет вторую итерацию, но продолжает –

Смежные вопросы