Это все о понимании ByteBuffer
и о том, как оно работает. Позвольте мне объяснить.
in.read(buffer.array());
Это записывает данные в базовый массив, но так как массив отделен от состояния исходного буфера, позиция буфер не расширен Это не хорошо, так как следующий вызов:
encryptingChannel.write(buffer);
теперь будет думать, что позиция равна 0. Ограничение также не изменилось и поэтому по-прежнему установлен на емкость : 256. Это означает, что результатом операции записи является запись 256 байтов и установка позиции в пределе (позиция).
Теперь операция чтения по-прежнему работает с базовым байтовым массивом, и его размер все еще составляет 256 байтов Таким образом, все последующие операции чтения происходят идеально. Однако все операции записи предполагают, что байтов для записи не существует, так как позиция остается на 256.
Для использования ByteBuffer
вы можете использовать FileBuffer.read
. Затем вам нужно flip
в буфер перед записью прочитанных данных. Наконец, после записи вам нужно clear
положение буфера (и ограничение, но оно изменяется только при последнем чтении), чтобы подготовить буфер для следующей операции чтения. Так что порядок обычно : чтение, отражение, запись, очистка для экземпляров Buffer
.
Не смешивайте Channel
s и потоки ввода / вывода, это сделает вашу жизнь излишне сложный, и научиться использовать ByteBuffer
достаточно сложно само по себе.