为什么我们在CharBuffer中需要`hasArray()`方法?

时间:2019-03-31 15:36:49

标签: java nio

CharBuffer具有方法array()hasArray()

为什么我们需要hasArray()

CharBuffer buf = CharBuffer.allocate(20)之后,hasArray()始终为真,在此之前-我们不能使用buf引用b / c对其进行初始化。

2 个答案:

答案 0 :(得分:1)

hasArray的条件是

(hb != null) && !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 /任何JDK工程师都知道他们在做什么;)

答案 1 :(得分:1)

是,但是:

System.out.println(ByteBuffer.allocateDirect(100).asCharBuffer().hasArray());

返回false

即使没有,也不知道如何获取缓冲区。您可以想象OS分配了缓冲区,而Java只是在使用它,例如打开文本文件时。您自己不能直接分配它是无关紧要的。

此外,hasArray()function defined in the parent class Buffer,因此仅出于这个原因,需要


另一个答案表明,从文档中检索只读访问数组也将返回false:

  

true仅在且仅当此缓冲区由数组支持且不是只读的时,才这样

这很有意义,因为您不想传递只读缓冲区,而只是通过有人检索后备数组并将数据以这种方式写入数组来更改它;毕竟,Java数组总是可变的。