Java中的内存映射文件


问题内容

我一直在尝试编写一些非常快速的Java代码,这些代码必须执行很多I / O。我正在使用返回ByteBuffer的内存映射文件:

public static ByteBuffer byteBufferForFile(String fname){
    FileChannel vectorChannel;
    ByteBuffer vector;
    try {
        vectorChannel = new FileInputStream(fname).getChannel();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
        return null;
    }
    try {
        vector = vectorChannel.map(MapMode.READ_ONLY,0,vectorChannel.size());
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
    return vector;
}

我遇到的问题是ByteBuffer .array()方法(应返回一个byte
[]数组)不适用于只读文件。我想编写我的代码,以便它可以与构造在内存中的内存缓冲区和从磁盘读取的缓冲区一起使用。但是我不想将所有缓冲区都包装为ByteBuffer.wrap()函数,因为我担心这样做会使速度变慢。因此,我一直在编写所有版本的两个版本,一个版本使用byte
[],另一个版本使用ByteBuffer。

我应该把所有东西都包好吗?还是我应该把所有东西都写一遍?


问题答案:

是否有人真正检查过ByteBuffers由内存映射创建的对象是否.array()首先支持调用,而与只读/读写无关?

据我所知,答案是“ 否”
。甲ByteBuffer的返回的直接能力byte[]经由阵列ByteBuffer.array()是由存在goverened
ByteBuffer.hbbyte[])中,当其被一直设置为空MappedByteBuffer被创建。

这对我来说很烂,因为我希望做与问题作者想要做的事情类似的事情。