java - Java 中的 ByteBuffer 到 String

标签 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"

arrays - 如何将Short/Int写入1字节缓冲区

java - 我无法推送 - jar :0. 0.1-SNAPSHOT : Could not find artifact org. springframework :spring-test:jar:5. 1.4.BUILD-SNAPSHOT

java - Java 中的通用特征

java - parseFloat() 与 parseDouble()

java - 无法从通过 SocketChannel 接收的消息中提取正确的信息

java - 将数字(short、int、long、float、double、bigint)转换为字节数组 : Scala/Java

将字节数组转换为 double 时出现 java.nio.BufferUnderflowException