Java可能的FileChannel.map错误

时间:2011-09-24 00:49:17

标签: java sun filechannel

所以我试图使用映射的FileChannel读取一个非常大的文件。

文件超过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作为文件大小。这个错误有意义吗?他们为什么不提供比这更大的文件的支持?

2 个答案:

答案 0 :(得分:4)

此函数使用的本机方法确实需要长值而不报告错误。你可以用反射来调用它们。但是,您可以测试它们是否适用于您的系统并以这种方式使用内存映射,可能会使您感到困惑而不是有用。

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

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

答案 1 :(得分:2)

这不是错误。 FileChannel#map被记录为要求size参数不大于Integer.MAX_VALUE,这有助于例如ByteBuffer#get为其index参数采用整数。