Почему .array() не работает с байт-буферами, возвращаемыми из файловых каналов map'ed?
-
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
метод перед вызовом этого метода для того, чтобы убедиться, что в этом буфере есть доступный резервный массив.