我有一些代码可以将某些特定的大型(大约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上,“僵尸”打开的文件没有任何问题。
答案 0 :(得分:2)
最后-我们找到了解决方案。非常感谢@Netherwire。 FileChannel类具有map
方法,该方法使用文件描述符进行一些隐式复制操作,因此在使用它时要小心。 Here是更多信息。