Java 中的 ByteBuffer 到 String

ByteBuffer to String in Java

我有这行代码

String s = new String(m_buffer.array());

其中 buffer 是一个 ByteBuffer。

有没有办法在不分配新字符串的情况下将字节缓冲区转换为字符串 and/or 涉及复制 char 数组? (即,有没有办法将 String 的 char[] 值安全地指向 ByteBuffer 的 byte[] hb?)

谢谢

Java 的 String class 是不可变的。为了维持这种保证,String 必须有自己对支持它的 char[] 的引用,并且其他任何人都不能拥有该引用。如果和ByteBuffer共用一个数组,Stringclass就不能保证不被修改了。另外,charbyte在Java中是不一样的。

将 ByteBuffer 转换为 String 的一种方法是使用 Charset 解码字节:

Charset charset = Charset.forName("ISO-8859-1");

ByteBuffer m_buffer = ...;

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

解码会创建一个 CharBuffer,您可以方便地将其转换为 String。您可以重用 CharSet 并且它是线程安全的。我不会太担心性能 (re "fastest way") 除非你在那个领域真的有问题。一般建议,当您想使用 ByteBuffer 时,尽可能晚地进行到字符串的转换,并且仅在需要字符串时才进行。

如 14jbella 所述,字符串是不可变的。无法从不包括复制数据的数组(字符或字节)创建字符串,因为数组是可变的。所以不行,不抄是没办法的。

您还应该考虑到,m_buffer.array() returns ByteBuffer 的内部数组可能比实际存储在缓冲区中的数据要多得多。从该数组创建一个 String 可能会导致潜在的巨大内存分配,因为数据被复制到一个新数组中。例如,如果您在代码中的某处使用了一个 256 MB 的 ByteBuffer,并且您从该缓冲区中获得了一个名为 m_buffer 的 32 字节的 slice() 以转换为字符串,那么您对 ​​[=18= 的调用] 将分配一个新的字节数组,其大小与原始支持字节数组的大小为 256 MB,如果需要 GC,这可能不会那么快。

顺便说一句。 new String(byte[]) 在内部使用 CharSet 解码器 ByteBuffer 环绕输入字节数组。