<分区>
我有一个在 Wildfly 中运行的 Web 应用程序,该应用程序的一部分通过以下方式使用临时文件:
File.createTempFile(...)
。
然后将该临时文件用作读写 java.io.RandomAccessFile 流的目标文件。该 RandomAccessFile 的 java.nio.channels.FileChannel 是与之交互并最终被截断的(当我完成它时)。文件的某些部分通过 FileChannel.map()
与文件的所有交互完成后,使用 fileChannel.truncate(size)
将文件截断为适当的大小。这是总是抛出 IOException 的地方
在 sun.nio.ch.FileDispatcherImpl.truncate0(本地方法)
IOException 消息是通用的:
java.io.IOException:无法对打开了用户映射部分的文件执行请求的操作
。
这是一个由同一进程显式创建的临时文件,在使用它期间它一直保持打开状态,可能只有几秒钟。谷歌搜索表明可能 AV 软件有该文件的句柄,或者其他一些应用程序正在使用它,但我已经尝试在具有不同配置的各种 VM 和常规 Windows 框上运行它,并且该问题可以可靠地重现。我认为肯定存在一些对文件工具的真正滥用,但我不知所措。
此外,这种异常在 Linux 机器上从未出现过,截断工作可靠。没有执行文件锁定,这是唯一在使用的文件,正在缓冲并写入 channel ,但没有发生任何奇怪的事情。
为了记录,我创建了一些示例测试应用程序来创建流、 channel 、临时文件、执行截断等,但我无法在独立应用程序中重现该问题。不幸的是,我不能直接分享源代码,所以我会尽力描述正在发生的事情,希望有人遇到过类似的事情并可以提供一些指导。