ByteBuffer到Java中的String

时间:2017-04-05 14:24:07

标签: java bytebuffer

我有这行代码

//Do it manually

其中buffer是ByteBuffer。

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

由于

2 个答案:

答案 0 :(得分:6)

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

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)创建不包含复制数据的String,因为数组是可变的。所以不,没有复制就没办法做到。

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

顺便说一下。 new String(m_buffer.array())内部使用new String(byte[])解码器围绕输入字节数组{/ 1}}。

答案 1 :(得分:4)

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