3

所以我正在尝试使用映射的 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 将 along作为文件大小。那么这个错误有意义吗?为什么他们不支持比这更大的文件?

4

2 回答 2

4

此函数使用的本机方法确实采用长值而不报告错误。您可以使用反射调用它们。但是,您将测试它们是否在您的系统上为您工作并以这种方式使用内存映射,可能会让您感到困惑,而不仅仅是有用。

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

虽然从技术上讲不是一个错误,但它是 BAD(Broken As designed)最初这样做的部分原因可能是 32 位 JVM 无法支持这一点,但我不明白为什么 64 位 JVM 仍然有这个限制。

于 2011-09-24T06:59:24.843 回答
2

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

于 2011-09-24T01:20:40.997 回答