[英]Java.nio.file.NoSuchFileException but files exits
我正在嘗試從文件夾中讀取文件。 該文件夾中有 >1000 個文件,我嘗試使用ScheduledThreadPoolExecutor.scheduleWithFixedDelay()
每 10 秒讀取 100 個文件
Files.list(Paths.get(path)).sorted().limit(limit).forEach(file ->{ //limit = 100
try{
String content = new String(Files.readAllBytes(file), "UTF-8");
//do business logic
doneFile.add(fileName);
}catch (Exception e){
log.error(e);
}
});
if(doneFile.size() > 0){
for(String fileName: doneFile){
try {
Files.delete(Paths.get(path + fileName));
} catch (IOException e) {
log.error(e);
}
}
}
大約 60-80 個文件被成功讀取,其他文件拋出java.nio.file.NoSuchFileException
。
刪除函數也會拋出一些java.nio.file.NoSuchFileException
。
但最后,盡管有例外,但在一些線程之后讀取並刪除了所有文件
在這種情況下是什么導致異常,我該如何解決? 非常感謝! 附言。 先生關於我的英語不好
我評論道:
聽起來像其他東西正在添加和刪除文件。 您是否有可能同時運行兩個計划任務? 是否有可能是外部進程正在執行此操作?
你回復:
我檢查了日志文件,發現
ScheduledThreadPoolExecutor.scheduleWithFixedDelay()
創建了 10 個線程,而不是 4 個循環中預期的 8 個線程
所以......聽起來你有兩個(或更多)線程遍歷同一個目錄,在沒有任何協調的情況下處理和刪除文件。 結合Files.list
將緩沖它列出的部分或全部目錄的事實,你會遇到如下問題:
在第二個線程嘗試打開它之前,一個線程刪除另一個文件流中的文件。 當后者嘗試打開文件時,這會導致NoSuchFileException
。
兩個線程同時處理同一個文件,一個刪除它,而第二個線程仍在處理它。 當后者嘗試刪除文件時,這會導致NoSuchFileException
。
可能的解決方案:
編寫代碼以忽略這些異常。 (但是您仍然可以讓兩個線程同時處理同一個文件,這似乎是一件壞事。)
重構代碼,以便在任何時候只有一個線程掃描目錄。
如果在目錄內處理時需要並行性,請讓目錄處理器線程將每個文件的任務提交給具有有限線程池的執行程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.