我的java进程代码中打开了一个文件,可以使用在try-with-resources语句中的Files.newOutputStream进行编写。在我完成文件的编写(所有以相同的方式编写)并关闭之后。它们与文件所在的文件夹一起删除。
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中显示为(已删除)并且意味着它们是打开的。 我无法理解封闭文件如何保持打开状态,最终我得到了太多的打开文件描述符。所以,我知道我可以提高限制,但我想正确关闭或关闭文件而不是增加限制。
谢谢!!!
答案 0 :(得分:-3)
我认为你实际上并没有关闭文件......对于lsof来说,它是一个没有关闭的文件句柄。
也许将finally {}块添加到您的代码中:
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));
确保测试out为非null,否则在尝试关闭时会抛出NullPointerException。
编辑: 忘了将outputStream移到try {} catch {} finally {} ...
之外