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

Nik*_*nko 6 java windows io java-8

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

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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Nik*_*nko 3

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