2011-09-24 212 views
2

所以我试图读取一个非常大的文件使用映射的FileChannel。Java可能FileChannel.map错误

该文件超过2GB。一个代码片段是:

long fileSize = 0x8FFFFFFFL; 
FileChannel fc = new RandomAccessFile("blah.huge", "rw").getChannel(); 
fc.map(FileChannel.MapMode.READ_WRITE, 0, fileSize); 

这引发错误:

Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE 
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:789) 

FileChannel.map需要long作为文件大小。那么这个错误是否有意义?为什么他们不支持比这更大的文件?

+0

按照记录工作,downvote。 – EJP

+1

+1:记录极限并不意味着它是有道理的。 –

回答

4

此函数使用的本地方法在不报告错误的情况下取值很长。你可以用反射来给他们打电话。然而,你会测试它们是否在你的系统上为你工作,并使用这种内存映射,可能会让你感到困惑,而不是有用。

最好的方法是创建一个MappedByteBuffers数组,每个尺寸1 GB,并创建一个隐藏这个丑陋的包装。

虽然技术上来说不是一个bug,它是坏的(破碎的设计)原因之一部分原因可能是32位JVM不能支持这一点,但我不明白为什么64位JVM仍然有这个限制。

2

这不是一个错误。 FileChannel#map被记录为需要不大于Integer.MAX_VALUE的参数size,这是合理的。 ByteBuffer#get的参数index取整数。

+0

有趣......为什么地图功能需要一个“长”的大小呢? – Andrew

+0

我会假设它是为了与其他'FileChannel'方法的同质性或预期的非愚蠢的'ByteBuffer';尽管我一直无法找到理由,并且会很乐意听到一个。 – Hugh

+0

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7147951 – GKislin