Java 7 filechannel在调用map方法后未正确关闭

Java 7 filechannel在调用map方法后未正确关闭,java,memory-management,java-7,filechannel,Java,Memory Management,Java 7,Filechannel,我正在开发一个sc2replay解析工具。我在MPQLIB之上构建它 不幸的是,该工具使用FileChannel来读取bzip文件, 并使用map(MapMode.READ_ONLY、hashtablePosition、hashTableSize) 调用该函数后,关闭文件通道不会释放进程中的文件。 具体来说,我无法重命名/移动该文件 这个问题发生在Java7中,在Java6上运行良好 下面是一个简单的代码片段来复制它: FileInputStream f = new FileInputS

我正在开发一个sc2replay解析工具。我在MPQLIB之上构建它

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

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

这个问题发生在Java7中,在Java6上运行良好

下面是一个简单的代码片段来复制它:

    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"));
注释掉fc.map将允许您重命名该文件

从这里开始

它声明您不需要同时关闭filechannel和filestream,因为关闭其中一个将关闭另一个。我也试着关闭其中一个或两个,但仍然不起作用

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

这是一个解决方案。bug报告引用java 1.4,并且他们认为它是文档错误。关闭filechannel不会关闭底层流。

祝您好运

似乎FileChannel.map导致了java 7上的问题。如果使用FileChannel.map,则无法再关闭该文件

一种快速解决方法是不使用FileChannel.map(MapMode.READ_ONLY,position,length)

你可以用

ByteBuffer b = ByteBuffer.allocate(length); 
fc.read(b,position);
b.rewind();

如果您使用的是Sun JRE,您可以通过强制转换到它们的实现并告诉它自己发布来作弊。我只建议您在不依赖正在关闭的文件或者不打算使用其他JRE的情况下这样做

在某种程度上,我希望类似这样的东西将使其成为适当的公共API

try (FileInputStream stream = new FileInputStream("test.SC2Replay");
     FileChannel channel = stream.getChannel()) {

    MappedByteBuffer mappedBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, 1);
    try {
        // do stuff with it
    } finally {
        if (mappedBuffer instanceof DirectBuffer) {
            ((DirectBuffer) mappedBuffer).cleaner().clean();
        }
    }
}

关闭通道或流是否引发某种运行时异常?未生成异常。我认为这可能是Java7本身的一个bug。我正在考虑将所有内容移植到.NETxD@tskaahyeah这里提到的bug报告是可疑的,标记为“无法复制”。关闭
FileChannel
将关闭底层文件描述符:本周早些时候我阅读了源代码。这里的问题是关闭映射文件不会释放映射。从上面开始,我尝试关闭filechannel和fileinputstream,还尝试仅关闭fileinputstream和仅关闭filechannel。一切都不起作用。该代码在java6上运行良好,但在java7上运行不好