为什么FileChannel.map会占用Integer.MAX_VALUE数据?

sid*_*178 13 java io nio

我在使用FileChannel.map时遇到异常

Exception in thread "main" java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
    at sun.nio.ch.FileChannelImpl.map(Unknown Source)
    at niotest.NioTest.readUsingNio(NioTest.java:38)
    at niotest.NioTest.main(NioTest.java:64)
Run Code Online (Sandbox Code Playgroud)

快速寻找到的OpenJDK执行显示,在方法映射(..)FileChannelImplsize型的long作为输入.但是在体内,它比较它Integer.MAX_VALUE并且如果它大于那个则抛出错误.为什么将long尺寸作为输入但是将其限制为最大integer长度?

有谁知道这个实现背后的具体原因?还是某种虫子?

源URL - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/ch/FileChannelImpl.java

我在64位Windows-2k8上使用64位JRE运行此程序

Stu*_*son 6

这不是特定于实现的错误.大小在FileChannel.map中定义为long,但是......

size - 要映射的区域的大小; 必须是非负数且不大于Integer.MAX_VALUE

所有兼容的JVM实现都是这样的.我怀疑原因是历史的组合(谁需要访问大于2GB的文件?;)并试图在更高版本的Java中推进事情(更容易允许大于Integer.MAX改变的值)从数据类型intlong).

很多人在Java API中发现这种基于int的思想有关任何文件非常混乱和短视.但请记住,Java在1995年开始开发!我敢肯定当时2GB似乎是一个相对安全的价值.