所以我尝试使用一个映射的FileChannel来读入一个非常大的文件。
文件超过2 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作为文件大小。那么这个错误有意义吗?为什么他们不提供对更大文件的支持?
发布于 2011-09-24 14:59:25
此函数使用的本机方法不会在不报告错误的情况下接受较长的值。您可以使用反射来调用它们。但是,您需要测试它们是否适用于您的系统,并且以这种方式使用内存映射可能会使您更困惑,而不是有用。
最好的方法是创建一个MappedByteBuffers数组,例如每个大小为1 GB的数组,并创建一个隐藏这种丑陋的包装器。
虽然从技术上讲这不是一个bug,但它是糟糕的(如设计的那样损坏),最初这样做的部分原因可能是32位JVM不支持这一点,但我不明白为什么64位JVM仍然有这个限制。
发布于 2011-09-24 09:20:41
这不是一个bug。FileChannel#map被记录为需要一个不大于Integer.MAX_VALUE的size参数,这是有意义的,例如ByteBuffer#get的index参数采用整数。
https://stackoverflow.com/questions/7536233
复制相似问题