Java.NIO InvalidIndexException - как читать и писать с произвольным доступом к большим файлам - PullRequest
1 голос
/ 09 января 2010

Я создал java.nio.MappedByteBuffer вокруг java.io.RandomAccessFile (файл размером всего 54 КБ). Результирующий MappedByteBuffer имеет «емкость» и «лимит» около 12 КБ, поэтому при попытке вызвать mybytebuffer.get(i > 13044) или mybytebuffer.put(i > 13044, value) он выдает InvalidIndexException.

Все это поведение задокументировано в официальных документах Sun. У меня вопрос, как я могу использовать java.nio ByteBuffers для чтения или записи в любом месте файла (мне нужен произвольный доступ). Я не могу найти пример или документацию Java NIO, которая иллюстрирует непоследовательный доступ.

Ответы [ 2 ]

1 голос
/ 09 января 2010

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 и получать доступ к байтам (как чтение, так и запись).

0 голосов
/ 09 января 2010

MappedByteBuffers сами не предлагают произвольный доступ. Это недоразумение. Используйте SeekableByteChannel для произвольного доступа.

...