<分区>
我有这行代码
String s = new String(m_buffer.array());
其中 buffer 是一个 ByteBuffer。
有没有一种方法可以在不分配新字符串和/或不涉及复制 char 数组的情况下将字节缓冲区转换为字符串? (即,有没有一种方法可以安全地将 String 的 char[] 值指向 ByteBuffer 的 byte[] hb?)
谢谢
标签 java bytebuffer
<分区>
我有这行代码
String s = new String(m_buffer.array());
其中 buffer 是一个 ByteBuffer。
有没有一种方法可以在不分配新字符串和/或不涉及复制 char 数组的情况下将字节缓冲区转换为字符串? (即,有没有一种方法可以安全地将 String 的 char[] 值指向 ByteBuffer 的 byte[] hb?)
谢谢
最佳答案
将 ByteBuffer 转换为 String 的一种方法是使用 Charset 来解码字节:
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()
以转换为 String ,您对 new String(m_buffer.array())
的调用将分配一个新的字节数组,其大小与原始支持字节数组的大小相同,为 256 MB,这可能不是那么快,如果它需要一个GC。
顺便说一句。 new String(byte[])
在内部使用 CharSet
解码器在 ByteBuffer
上包裹您的输入字节数组。
关于java - Java 中的 ByteBuffer 到 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43234003/
相关文章:
java - 如何捕获Kafka-Spring中的反序列化错误?
java - TimerTask + multiThreading + java,不适用于第二次执行
java - 使用 ByteBuffer 将 long 转换为 "unsigned, 4 byte integer in network byte order"
java - parseFloat() 与 parseDouble()
java - 无法从通过 SocketChannel 接收的消息中提取正确的信息
java - 将数字(short、int、long、float、double、bigint)转换为字节数组 : Scala/Java