1

我创建了一个java.nio.MappedByteBuffer围绕一个java.io.RandomAccessFile(一个只有 54 KB 大小的文件)。结果MappedByteBuffer具有大约 12 KB 的“容量”和“限制”,所以当我尝试调用mybytebuffer.get(i > 13044)mybytebuffer.put(i > 13044, value)它抛出一个InvalidIndexException.

所有这些行为都记录在 Sun 的官方 javadocs 中。我的问题是如何使用java.nio ByteBuffers文件中的任何位置读取或写入(我需要随机访问)。我似乎找不到说明非顺序访问的 Java NIO 示例或文档。

4

2 回答 2

1

MappedByteBuffer可以随机访问文件...它是一个“直接字节缓冲区”。(具体来说,它使用操作系统的虚拟内存子系统将文件映射到内存。)

您可以在此处的代码片段中随机访问字节:

public void doIt() throws FileNotFoundException, IOException {
    File file = new File("myfile");
    RandomAccessFile raf = new RandomAccessFile(file, "rw");
    FileChannel fc = raf.getChannel();      
    MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, file.length());

    //get a random byte
    byte b1 = mbb.get(SOME_RANDOM_BYTE); 

    //get another random byte
    mbb.position(SOME_OTHER_BYTE_POSITION);
    byte b2 = mbb.get();
}

您可以根据需要移动 MBB 并访问字节(读取和写入)。

于 2010-01-09T13:09:47.800 回答
-1

MappedByteBuffers 本身不提供随机访问。这是一种误解。使用 SeekableByteChannel 进行随机访问。

于 2010-01-09T01:53:27.297 回答