我有这行代码
String s = new String(m_buffer.array());
Run Code Online (Sandbox Code Playgroud)
其中buffer是ByteBuffer.
有没有办法将bytebuffer转换为字符串而不分配新的String和/或涉及复制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();
Run Code Online (Sandbox Code Playgroud)
解码创建一个CharBuffer
您可以方便地转换为String
.你可以重用它CharSet
,它是线程安全的.我不会过分担心性能(重新"最快的方式"),除非你在这方面确实存在问题.一般建议,当您想使用ByteBuffer时,尽可能晚地进行to-String转换,并且仅在需要String时进行.
正如14jbella所提到的,字符串是不可改变的.无法从数组(char或byte)创建不包含复制数据的String,因为数组是可变的.所以不,没有复制就没有办法做到这一点.
此外,您应该考虑,它m_buffer.array()
返回的内部数组ByteBuffer
,这可能比存储在缓冲区中的实际数据多得多.从该数组创建String可能会导致潜在的巨大内存分配,因为数据会被复制到新数组中.例如,如果您在代码中的某处使用256 MB ByteBuffer,并且从该缓冲区中获取了slice()
32个字节以m_buffer
转换为String,那么您的调用new String(m_buffer.array())
将分配一个原始大小的新字节数组,支持字节数组,256 MB,如果它需要GC,可能不是那么快.
顺便说一句.new String(byte[])
内部使用CharSet
解码器ByteBuffer
包裹输入字节数组.
归档时间: |
|
查看次数: |
6948 次 |
最近记录: |