#java #nio
#java #nio
Вопрос:
В CharBuffer есть методы array()
и hasArray()
.
Зачем нам вообще нужен hasArray()
?
После CharBuffer buf = CharBuffer.allocate(20)
, hasArray()
всегда имеет значение true, до — мы не можем использовать ссылку buf, потому что она неинициализирована.
Комментарии:
1. @markspace Нет
CharBuffer.allocateDirect()
… Это только дляByteBuffer
afaik.
Ответ №1:
Условием для hasArray
является
(hb != null) amp;amp; !isReadOnly
isReadOnly
изменения, если вы используете asReadOnlyBuffer
CharBuffer.allocate(20).asReadOnlyBuffer();
например.
Так что да, нам это нужно.
Возьмите эту строку
final CharBuffer cb = instance.getCharBuffer(...);
Доступен ли он только для чтения или нет? Содержит ли он допустимый char[]
массив? Мы действительно не знаем. Если мы сделаем
cb.array();
и это буфер, доступный только для чтения, мы получаем ReadOnlyBufferException
.
Если он не поддерживается char[]
массивом, мы получаем UnsupportedOperationException
.
Итак, что мы могли бы сделать, это
if (cb.hasArray()) {
final char[] arr = cb.array();
}
Теперь мы Exception
в безопасности.
Кроме того, вы можете быть уверены, что инженеры Oracle / OpenJDK / whateverJDK знают, что они делают 😉
Ответ №2:
Да, но:
System.out.println(ByteBuffer.allocateDirect(100).asCharBuffer().hasArray());
ВОЗВРАТ false
.
И даже если бы этого не произошло, заранее неизвестно, как был извлечен буфер. Можно представить, что ОС выделяет буфер и что он просто используется Java, например, при открытии текстового файла. То, что вы не можете напрямую выделить его самостоятельно, несущественно.
Кроме того, это hasArray()
функция, определенная в родительском классе Buffer
, поэтому она должна присутствовать только по этой причине.
Как указывает другой ответ, извлечение массива, доступного только для чтения, также вернет false из документации:
true
если, и только если, этот буфер поддерживается массивом и не доступен только для чтения
это имеет смысл, поскольку вы не хотите передавать буфер, доступный только для чтения, только для того, чтобы его изменил кто-то, извлекающий резервный массив и записывающий данные в массив таким образом; В конце концов, массивы Java всегда изменчивы.