Java.NIO InvalidIndexException - 如何使用随机访问大文件进行读写

时间:2010-01-09 01:26:59

标签: java nio

我在java.nio.MappedByteBuffer周围创建了一个java.io.RandomAccessFile(文件大小只有54 KB)。生成的MappedByteBuffer的“容量”和“限制”大约为12 KB,因此当我尝试调用mybytebuffer.get(i > 13044)mybytebuffer.put(i > 13044, value)时,它会抛出InvalidIndexException

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

2 个答案:

答案 0 :(得分: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并访问字节(读取和写入)。

答案 1 :(得分:0)

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