2014-10-13 7 views
0

Я использую этот код, чтобы прочитать все папки в файловой системе Procjava.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

Исключение возникает при первой итерации или после нескольких итераций? Это также может быть проблемой в части '// Some logic'. – sp00m

+0

Я получаю его после многих циклов. –

ответ

1

Согласно оракулу Javadoc: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream(java.nio.file.Path)

Когда не используя примерочных с-ресурсов построить, затем закрыть способ каталог потоков должен быть вызван после итерации завершается так, чтобы освободить любые ресурсы, предназначенные для открытого каталога , То, что вы делаете неправильно, вызывает newDirectoryStream в цикле for, поэтому вы не можете использовать его методы.

Я только думаю, вы должны сделать это таким образом (если вы не хотите использовать примерочных с-ресурсов):

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

Похоже, у вас есть проблемы в вас логике, как уже упоминалось Питер. Вы должны быть уверены, что вы закрываете ресурсы ввода-вывода на каждой итерации. Используйте try-with-resources для обработки ресурсов ввода-вывода внутри вашего цикла for-loop. Не могли бы вы показать и логический код?

О, вам обязательно нужно будет закрыть DirectoryStream.

-1

Эта ошибка может возникнуть, если вы слишком часто пытаетесь выполнять некоторые операции, связанные с файлами. Обычно есть петля без задержки. Попробуйте добавить Thread.sleep().