Почему .array () не работает с ByteBuffers, возвращенными из FileChannels с отображением на карте? - PullRequest
5 голосов
/ 28 июня 2009

Я делаю IO с отображением памяти в Java. Класс FileChannel позволяет вам сопоставить ByteBuffer с определенной частью файла. Я делаю это с открытым файлом только для чтения.

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю исключение при попытке вызвать метод .array () в результирующем ByteBuffer. Возможно, это потому, что .array () возвращает массив byte [], и я действительно хочу завершенный массив байтов?

Есть ли способ обойти это?

1 Ответ

3 голосов
/ 28 июня 2009

Я собираюсь предположить, что речь идет о методе FileChannel.map, который может сопоставить файл с памятью, к которой можно получить доступ MappedByteBuffer.

В документации к методу FileChannel.map, если файл отображается только для чтения, любая попытка изменить буфер приведет к ReadOnlyBufferException:

Область файла может отображаться в память в одном из трех режимов:

  • Только для чтения: любая попытка изменить результирующий буфер вызовет ReadOnlyBufferException быть брошенным. (MapMode.READ_ONLY) * * тысяча двадцать-одна

С точки зрения исключений, генерируемых методом ByteBuffer.array, существует два типа исключений, которые генерируются в зависимости от причины проблемы:

Выдает:

  • ReadOnlyBufferException - Если этот буфер поддерживается массивом, но доступен только для чтения
  • UnsupportedOperationException - Если этот буфер не поддерживается доступным массивом

Хотя выбрасываемое исключение не упоминается в этом вопросе, возможно, файл, доступный только для чтения, вызывает выброс ReadOnlyBufferException методом array.

Также следует отметить, что метод ByteBuffer.array является дополнительной операцией:

Возвращает байтовый массив, который поддерживает это буфер (необязательная операция).

Чтобы быть уверенным в том, что метод array вернет byte[], который можно использовать, вызовите метод hasArray, как предлагается в документации для метода array:

Перед вызовом метода hasArray вызывая этот метод для того, чтобы убедитесь, что этот буфер имеет доступный резервный массив.

...