所以我试图使用映射的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
作为文件大小。这个错误有意义吗?他们为什么不提供比这更大的文件的支持?
答案 0 :(得分:4)
此函数使用的本机方法确实需要长值而不报告错误。你可以用反射来调用它们。但是,您可以测试它们是否适用于您的系统并以这种方式使用内存映射,可能会使您感到困惑而不是有用。
最好的方法是创建一个MappedByteBuffers数组,例如:每个尺寸1 GB,并创建一个隐藏这种丑陋的包装。
虽然从技术上讲不是一个bug,但它是坏的(设计时破坏)原因可能是32位JVM无法支持这一点的部分原因,但我不明白为什么64位JVM仍然有这个限制。
答案 1 :(得分:2)
这不是错误。 FileChannel#map
被记录为要求size
参数不大于Integer.MAX_VALUE
,这有助于例如ByteBuffer#get
为其index
参数采用整数。