首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java可能的FileChannel.map错误

Java可能的FileChannel.map错误
EN

Stack Overflow用户
提问于 2011-09-24 08:49:17
回答 2查看 1.3K关注 0票数 3

所以我尝试使用一个映射的FileChannel来读入一个非常大的文件。

文件超过2 2GB。下面是一段代码:

代码语言:javascript
复制
long fileSize = 0x8FFFFFFFL;
FileChannel fc = new RandomAccessFile("blah.huge", "rw").getChannel();
fc.map(FileChannel.MapMode.READ_WRITE, 0, fileSize);

这会抛出一个错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
   at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:789)

FileChannel.map采用long作为文件大小。那么这个错误有意义吗?为什么他们不提供对更大文件的支持?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-24 14:59:25

此函数使用的本机方法不会在不报告错误的情况下接受较长的值。您可以使用反射来调用它们。但是,您需要测试它们是否适用于您的系统,并且以这种方式使用内存映射可能会使您更困惑,而不是有用。

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

虽然从技术上讲这不是一个bug,但它是糟糕的(如设计的那样损坏),最初这样做的部分原因可能是32位JVM不支持这一点,但我不明白为什么64位JVM仍然有这个限制。

票数 4
EN

Stack Overflow用户

发布于 2011-09-24 09:20:41

这不是一个bug。FileChannel#map被记录为需要一个不大于Integer.MAX_VALUEsize参数,这是有意义的,例如ByteBuffer#getindex参数采用整数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7536233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档