Почему .array() не работает с байт-буферами, возвращаемыми из файловых каналов map'ed?

StackOverflow https://stackoverflow.com/questions/1054020

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

Есть ли какой-нибудь способ обойти это?

Это было полезно?

Решение

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

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

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

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

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

Бросает:

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

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

Кроме того, следует также упомянуть, что ByteBuffer.array метод - это необязательная операция:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top