ByteBuffer to String in Java 中的字符串



我有这行代码

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

其中缓冲区是字节缓冲区。

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

谢谢

将 ByteBuffer 转换为字符串的一种方法是使用字符集来解码字节:

Charset charset = Charset.forName("ISO-8859-1");
ByteBuffer m_buffer = ...;
String text = charset.decode(m_buffer).toString();

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

正如14jbella提到的,字符串是不可变的。无法从不包括复制数据的数组(字符或字节)创建字符串,因为数组是可变的。所以不,没有复制就没有办法做到这一点。

此外,您应该考虑到,m_buffer.array()返回ByteBuffer的内部数组,这可能比缓冲区中存储的实际数据多得多。从该数组创建 String 可能会导致潜在的大量内存分配,因为数据会被复制到新数组中。例如,如果您在代码中的某处使用 256 MB 的 ByteBuffer,并且您从该缓冲区获得名为m_buffer的 32 个字节的slice()以转换为字符串,则您对new String(m_buffer.array())的调用将分配一个与原始后备字节数组大小相同的新字节数组,即 256 MB, 如果它需要 GC,这可能不是那么快。

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

Java的String类是不可变的。为了维持这种保证,String必须有自己的参考来支持它的char[],其他人不得有这种参考。如果它要与ByteBuffer共享一个数组,String类不能保证它不会被修改。此外,charbyte在 Java 中并不相同。

最新更新