我有这行代码字节缓冲区为String在Java中
String s = new String(m_buffer.array());
其中缓冲区字节缓冲区。
有没有办法将字节缓冲区转换为字符串而不分配新的字符串和/或涉及到char数组的拷贝? (即是有办法只是指向字符串的字符[]值字节缓冲区的字节[] HB安全?)
感谢
我有这行代码字节缓冲区为String在Java中
String s = new String(m_buffer.array());
其中缓冲区字节缓冲区。
有没有办法将字节缓冲区转换为字符串而不分配新的字符串和/或涉及到char数组的拷贝? (即是有办法只是指向字符串的字符[]值字节缓冲区的字节[] HB安全?)
感谢
到字节缓冲区转换为字符串是使用一个字符集的字节解码方式:
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)中创建一个不包含复制数据的字符串,因为数组是可变的。所以不行,没有复制就没有办法做到这一点。
此外,您应该考虑,m_buffer.array()
返回ByteBuffer
的内部数组,这可能比存储在缓冲区中的实际数据多得多。从该数组创建一个字符串可能会导致潜在的巨大内存分配,因为数据被复制到一个新的数组中。例如,如果您在代码的某个地方使用256 MB ByteBuffer,并且您从该缓冲区获得一个名为m_buffer
的32字节slice()
以转换为String,则调用new String(m_buffer.array())
将分配一个新的字节数组原始的后备字节数组,这是256 MB,如果它需要GC,可能不那么快。
Btw。 new String(byte[])
内部使用围绕输入字节数组的解码器。
Java的String
类是不可变的。为了保持这一保证,String
必须自己参考支持它的char[]
,并且没有其他人可以提供该参考。如果它要与ByteBuffer
共享一个数组,String
类无法保证它不会被修改。另外,在Java中,char
和byte
不相同。
谢谢你们。那么我的做法是将字节缓冲区转换为字符串的“最快方法”? (就像StringBuilder的帮助?) – Mag
首先'byte []'不是'char []',其次不是。您应该更加担心从字节创建字符串而不指定编码。一种非常好的方法,可以在您的默认编码更改后立即编写代码。 – Kayaman
字符串在Java中是不可变的,所以这是不可能的另一个原因。 –