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

Java 在lsof as中打开文件描述符(已删除),java,file-io,nio,filechannel,Java,File Io,Nio,Filechannel,我的java进程代码中有一个文件,它使用Files.newOutputStream打开一个文件进行编写,该文件位于try with resources语句中。在我写完文件(所有文件都是以相同的方式编写的)并关闭之后。它们与文件所在的文件夹一起删除 String folder = "folder" try(OutputStream out = Files.newOutputStream(Paths.get(folder + '/' + fileName), StandardOpenOpti

我的java进程代码中有一个文件,它使用Files.newOutputStream打开一个文件进行编写,该文件位于try with resources语句中。在我写完文件(所有文件都是以相同的方式编写的)并关闭之后。它们与文件所在的文件夹一起删除

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


谢谢

我认为您实际上并没有关闭文件……对于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是否为notnull,否则在尝试关闭时它将抛出NullPointerException

编辑:
忘记将OutputStream移到try{}catch{}finally{}…

之外,请编辑您的问题以包含java程序中的相关源代码。Ie,创建、写入和删除这些文件的代码。@SlavaG,什么是FileUtils?apache commons io?@lincolnadym FileUtils.forceDelete是apache FileUtils,对吗。@Slavg,根据下面的评论,我认为您在lsof中获得所有这些延迟文件句柄的原因是新文件(文件夹)。@Slavg,这行代码是您的问题,FileUtils.forceDelete(新文件(文件夹));我下载了apache commons io源代码并检查了FileUtils.forceDelete()代码…它创建了一个File[]对象数组,该数组正在lsof中创建所有这些文件句柄。try{Outputstream}模式的工作方式是,一旦文件超出范围,它应该自动关闭该文件。我想知道FileUtils调用是否真的在文件上创建了一个新的文件句柄。Hmmm,在FileUtils.forceDelete(新文件(文件夹))中创建了什么新文件(文件夹)?代码会“建议”一个“单个”新文件句柄,但如果文件夹中填充了100个文件,FileUtils是否会创建100个新文件()句柄?@lincolnadym没有“
文件
句柄”这样的东西。它们只是对象,没有与文件系统的连接。@lincolnadym FileUtils.forceDelete是Java中的Apache FileUtils@EJP,是的,它们是对象,但打开的每个文件都会在操作系统上创建一个句柄。