RandomAccessFile неожиданное поведение для поиска и записи или записи со смещением - PullRequest
0 голосов
/ 07 октября 2018

Я не могу понять, в чем разница между

RandomAccessFile raf = new RandomAccessFile(file, "rw");
int offset = getOffset();
byte[] dataInBytes = getData();
raf.seek(offset);
raf.write(dataInBytes, 0, getSize())'

и

...
byte[] dataInBytes = getData();
raf.write(dataInBytes, offset, getSize());

Я думал, что поиск и затем запись эквивалентны использованию функции записи со смещением вместо нуля.Но, похоже, дело не в этом.Я не знаю, в чем разница, мне просто нужно пройти модульные тесты, а вторая версия проходит модульные тесты, а первая - нет.

В чем разница между этими двумя подходами?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Посмотрите на JavaDoc RandomAccessFile # write (byte []. Int, int) :

Записывает len байтов из указанного байтового массива, начиная со смещения от этогоfile.
Параметры :
b - данные.
off - начальное смещение в данных.
len - количество записываемых байтов.

Параметр смещения, который вы передаете в write(byte[], int, int), - это не смещение в файле, а смещение в передаваемом вами байтовом массиве.

Позиции вашего первого фрагмента кодаRandomAccessFile в позиции offset и затем записывает getSize() байтов от начала массива данных в этой позиции.

Ваш второй фрагмент кода не меняет позицию в пределах RandomAccessFile (что, вероятно,означает начало записи в начале файла), а затем записывает getSize() байтов массива данных, начиная с байта в позиции offset в байтовом массиве.

0 голосов
/ 07 октября 2018

В первом случае смещение находится в файле, к которому вы обращаетесь.В последующем это смещение в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...