2014-10-13 194 views
0

我使用這個代碼來讀取proc文件系統java.nio.file.FileSystemException:/ proc中:打開的文件太多

for (Path processPath : 
     Files.newDirectoryStream(FileSystems.getDefault().getPath("/proc"), "[0-9]*")) 
    { 
     // Some logic     
    } 

所有文件夾一段時間後,我得到這個錯誤

java.nio.file.FileSystemException: /proc: Too many open files 

看起來像這個循環打開文件而不關閉它們。每次循環運行後有沒有辦法關閉文件?

+0

在第一次迭代或迭代後會拋出異常嗎?這也可能是「//某些邏輯」部分的問題。 – sp00m

+0

我在很多週期運行之後得到它。 –

回答

1

根據甲骨文的Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream(java.nio.file.Path)

不使用時試戴與資源構建,然後目錄流的close方法被調用反覆完成後,以免費爲開放式目錄持有的任何資源。你做錯了什麼是在for循環中調用newDirectoryStream,所以你不能使用它的方法。

我只覺得,你應該這樣做的(如果你不想使用try-與資源):

 DirectoryStream<Path> dirStream = Files.newDirectoryStream(FileSystems.getDefault().getPath("/proc"), "[0-9]*"); 
    for (Path processPath : dirStream) 
    { 
     // your logic     
    } 
    dirStream.close(); 
1

看起來你有問題,你的邏輯,彼得提及。您必須確保每次迭代都關閉I/O資源。使用try-with-resources來處理for循環中的I/O資源。你能告訴你邏輯代碼嗎?

哦,您當然也需要關閉DirectoryStream

-1

當您嘗試過於頻繁地執行一些與文件相關的操作時可能會發生此錯誤。通常有一個沒有延遲的循環。嘗試添加一個Thread.sleep()