我在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示例或文档。
答案 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进行随机访问。