Java ByteBuffer.asCharArray().array()上的UnsupportedOperationException

Java ByteBuffer.asCharArray().array()上的UnsupportedOperationException,java,nio,java-6,Java,Nio,Java 6,有人能这么好心地解释一下为什么在下面这行中我有不支持的操作异常吗 System.out.println(ByteBuffer.wrap(新字节[]{'t','e','s','t','n'}).asCharBuffer().array()) asCharBuffer不包装char[],因此无法获取其array() 看来你要做的是 System.out.println(Arrays.toString("test\n".toCharArray())); 你读了Javadoc吗 并非所有的CharBu

有人能这么好心地解释一下为什么在下面这行中我有不支持的操作异常吗

System.out.println(ByteBuffer.wrap(新字节[]{'t','e','s','t','n'}).asCharBuffer().array())


asCharBuffer不包装
char[]
,因此无法获取其
array()

看来你要做的是

System.out.println(Arrays.toString("test\n".toCharArray()));

你读了Javadoc吗

并非所有的
CharBuffer
s都有
char[]
支持
ByteBuffer.asCharBuffer()
ByteBuffer
的视图返回为
CharBuffer
,因此其结果由
字节[]
支持

array()
仅返回实际支持缓冲区的
char[]
,如果不存在缓冲区,则抛出UOE。你能得到的最接近的替代方案是

char[] result = new char[charBuf.remaining()];
charBuf.get(result);

事实上,我正在用ByteBuffer读取FileChannel(当然知道它是文本文件),并且希望使用ByteBuffer的CharBuffer。如果我做不到,有这个方法的原因是什么?第二个问题是如何以正确的方式进行?谢谢。当您构建CharBuffer时,它是
char[]
的包装器,您可以使用
array()
来获取构建缓冲区的原始数组。类似于?注意,您遇到的问题是,您必须读取整数个字符,如果使用多字节字符编码,这可能会很棘手,除非你在解码前把所有的东西都读了。好啊我懂了。谢谢。