FileOutputStream try-with-resources不会关闭文件描述符

时间:2019-04-16 14:43:09

标签: java windows java-8 io

我有一些代码可以将某些特定的大型(大约15,000个条目)二进制序列化文件存档提取到磁盘上的文件夹中。

public void extractExact(Path absolutePath, DoubleConsumer progressConsumer) throws IOException
{
    ...
    // Extract to file channel
    try (final FileOutputStream fos = new FileOutputStream(absolutePath.toFile()))
    {
        PakExtractor.Extract(pakFile, Entry, fos.getChannel(), progressConsumer);
    }
 }

extractExact函数调用存档中的每个条目。

在此之后,如果我尝试调用Files.delete(<archive_file_path>)方法-我将得到一个异常:

  

java.nio.file.FileSystemException:该进程无法访问该文件,因为该文件正在被另一个进程使用。

我在Process Explorer搜索中检查了存档文件,并说我的java.exe可以打开约1.5万个文件(与存档中的文件一样多)

这仅在Windows(jdk1.8.0_162)中发生。在Linux上,“僵尸”打开的文件没有任何问题。

1 个答案:

答案 0 :(得分:2)

最后-我们找到了解决方案。非常感谢@Netherwire。 FileChannel类具有map方法,该方法使用文件描述符进行一些隐式复制操作,因此在使用它时要小心。 Here是更多信息。