Java中的ByteBuffer如何转换为字符串

3
我有这行代码。
String s = new String(m_buffer.array());

这里的buffer是一个ByteBuffer。

有没有一种方法可以将bytebuffer转换为字符串,而不需要分配新的String和/或涉及字符数组复制?(也就是说,有没有一种方式可以安全地将String的char []值指向ByteBuffer的byte [] hb?)

谢谢


7
首先,byte[] 不是 char[]。其次,不应该这样做。你应该更担心的是在未指定编码的情况下从字节创建字符串,这很容易导致代码出错,尤其是当默认编码改变时。 - Kayaman
4
Java中的字符串是不可变的,所以这就是为什么这种操作不可能的另一个原因。 - Steve Smith
2个回答

7
使用Charset解码字节是将ByteBuffer转换为String的一种方法:
Charset charset = Charset.forName("ISO-8859-1");

ByteBuffer m_buffer = ...;

String text = charset.decode(m_buffer).toString();

解码会创建一个CharBuffer,您可以方便地将其转换为String。您可以重复使用CharSet,并且它是线程安全的。除非在该领域真的存在问题,否则不必过分担心性能(有关“最快的方法”)。一般建议,当您想要使用ByteBuffer时,应尽可能晚地进行to-String转换,并且仅在需要String时才进行转换。
正如14jbella所提到的,字符串是不可变的。没有办法从数组(char或byte)中创建字符串而不包括数据复制,因为数组是可变的。因此,没有办法在不复制数据的情况下完成此操作。
此外,您应该考虑到m_buffer.array()返回ByteBuffer的内部数组,其中的大小可能比缓冲区中实际存储的数据要大得多。从该数组创建字符串可能会导致潜在的巨大内存分配,因为数据会被复制到新数组中。例如,如果您在代码的某个地方使用了256MB的ByteBuffer,并从中获取名为m_buffer的32字节的slice以转换为字符串,则调用new String(m_buffer.array())将分配一个与原始支持字节数组大小相同的新字节数组,即256MB,如果需要GC,则可能不那么快。
顺便说一句,new String(byte [])在内部使用CharSet解码器,该解码器包装在围绕您的输入字节数组的ByteBuffer中。

4

Java中的String类是不可变的。为了保持这个保证,String必须拥有自己的char[]引用,而其他人不能拥有该引用。如果它与ByteBuffer共享数组,则String类无法保证它不会被修改。此外,在Java中,charbyte并不相同。


1
谢谢大家。这么做是将ByteBuffer转换为字符串的“最快方法”吗?(例如StringBuilder是否有帮助?) - Theboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接