3

有没有一种方法可以在不首先从缓冲区读取内容到中间体的情况下构造一个Stringfrom ?ByteBufferbyte[]char[]

一个类似于接受 byte[] 的字符串构造函数的 API 让我觉得很理想:

public String(ByteBuffer buffer, int offset, int length, Charset charset)

...但不存在这样的事情。

我发现如何从 ByteBuffer 转换为 Integer 和 String?,但它使用辅助数组。

到目前为止,我发现的下一个最好的事情是将字节缓冲区投影为 aCharBuffer和 call toString()。但这不允许使用类似UTF-8.

4

4 回答 4

3

怎么样CharsetDecoder.decode和调用toString返回的CharBuffer.

于 2013-02-25T23:58:42.297 回答
1

哪有这回事。

ByteBuffer 不包含字符。必须先将它们转换为字符,然后才能用它们制作字符串。

此外,字符串必须在 JVM 内存中。ByteBuffer 可以被映射或直接,在这两种情况下它都在 JVM 之外。

为了将数据移入 JVM 并将其转换为字符,您必须使用辅助数组。

于 2013-02-25T23:58:26.237 回答
1

java.lang.String 是不可变的和最终的,因此最终别无选择,只能最终以它已经接受的格式提供数据。(当然没有通过反射来操纵它的内部......)

您可以隐藏使用字符串构建器或其他东西的 API 背后的丑陋,但在某些时候,内存中会有两个数组副本,一个在构建器中,另一个用于实际字符串。

于 2013-02-26T00:01:38.877 回答
0

Stringchars 组成,而不是bytes。您需要一个字符集,用于将字节转换为字符,例如 UTF-8、UTF-16、ISO-8859-1、ISO-8859-5、...

如果你不知道字符集,你就不会知道字节代表哪个字符

于 2013-02-26T00:01:56.323 回答