2016-05-10 10 views
-2

У меня есть в моем коде процесса java, который открывает файл для записи с использованием Files.newOutputStream, который находится внутри оператора try-with-resources. После того, как я закончил писать файлы (все написано так же) и закрыто. Они удалены вместе с папкой, в которой находятся файлы.Открыть файловые дескрипторы в lsof as (удалено)

String folder = "folder" 
    try(OutputStream out = Files.newOutputStream(Paths.get(folder + '/' + fileName), StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { 
     //... 
     out.write(buffer); 
     //... 
    } catch(IOException excp) { 
     excp.printStackTrace(); 
    } 
    FileUtils.forceDelete(new File(folder)); 

Но, когда я смотрю в LSOF (я бегу CentOS) Я вижу, что эти файлы (и не может быть 20k или 30k) показаны как (удалены) в LSOF и означает, что они открыты. Я не могу понять, как закрытый файл может оставаться открытым, и в конечном итоге я получаю слишком много открытых дескрипторов файлов. Итак, я знаю, что могу поднять предел, но я хочу правильно закрыть или сделать файл закрытым, а не увеличивать пределы.

Спасибо !!!

+1

Пожалуйста, измените вопрос, чтобы включить соответствующий исходный код вашей программы Java. То есть, код, который создает эти файлы, записывает на них и удаляет их. – Kenster

+0

@SlavaG, что такое FileUtils? apache commons io? – lincolnadym

+0

@lincolnadym FileUtils.forceDelete - это Apache FileUtils, правильно. – SlavaG

ответ

-2

Я думаю, что вы фактически не закрываете файлы ... для lsof это файловая ручка, которая не закрывается.

Может добавить, наконец, {} блок кода:

OutputStream out = null 
try { 
    out = Files.newOutputStream(Paths.get(folder + '/' + fileName), StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { 
    //... 
    out.write(buffer); 
    //... 
} catch(IOException excp) { 
    excp.printStackTrace(); 
} 
finally { 
    if (out != null) { out.close(); } 
} 
FileUtils.forceDelete(new File(folder)); 

Убедитесь, что вы проверить в течение не равно нулю, в противном случае он будет бросать NullPointerException, когда вы пытаетесь близко.

EDIT: Забыл переместить OutputStream вне попытки {} {} улова, наконец, {} ...

+0

Способ работы шаблона try {Outputstream}, должен ли он автоматически закрывать файл, когда он выходит из области видимости. Интересно, действительно ли вызов FileUtils фактически создает новую файловую ручку в файле. – lordoku

+0

Хммм, что нового Файл (папка) создает внутри FileUtils.forceDelete (новый файл (папка))? Код будет «предлагать» «один» новый дескриптор файла, но если папка заполнена 100 файлами, создает ли FileUtils 100 новых файлов File()? – lincolnadym

+0

@lincolnadym Нет такой вещи, как «дескриптор файла». Это просто объекты, без подключения к файловой системе. – EJP

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

  • Нет связанных вопросов^_^