调用map方法后,Java 7文件通道未正确关闭

tsk*_*eah 5 java memory-management filechannel java-7

我正在研究一个sc2replay解析工具.我在MPQLIB http://code.google.com/p/mpqlib/之上构建它

不幸的是,该工具使用文件通道来读取bzip文件并使用 map(MapMode.READ_ONLY, hashtablePosition, hashTableSize);

调用该函数后关闭文件通道不会在该过程中释放该文件.具体来说,我无法重命名/移动文件.

问题出现在Java 7中,它在Java 6上运行良好.

这是一个复制它的简单代码片段:

    FileInputStream f = new FileInputStream("test.SC2Replay");
    FileChannel fc = f.getChannel();

    fc.map(MapMode.READ_ONLY, 0,1);

    fc.close();

    new File("test.SC2Replay").renameTo(new File("test1.SC2Replay"));
Run Code Online (Sandbox Code Playgroud)

注释掉fc.map将允许您重命名该文件.

PS从这里我应该关闭FileChannel吗?

它声明您不需要关闭文件通道和文件流,因为关闭一个将关闭另一个.我也试过关闭其中一个或两个,但仍然没有奏效.

在Java 7上使用FileChannel.map读取数据后是否有重命名文件的解决方法,因为现在每个人似乎都有Java 7?

0xC*_*ABE 0

这是一个已记录的错误。该错误报告引用了 Java 1.4,他们认为这是一个文档错误。关闭文件通道不会关闭底层流。