在lsof中打开文件描述符为(已删除)

时间:2016-05-10 22:23:54

标签: java file-io nio filechannel

我的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中显示为(已删除)并且意味着它们是打开的。 我无法理解封闭文件如何保持打开状态,最终我得到了太多的打开文件描述符。所以,我知道我可以提高限制,但我想正确关闭或关闭文件而不是增加限制。

谢谢!!!

1 个答案:

答案 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 {} ...

之外