我有这行代码
String s = new String(m_buffer.array());
其中缓冲区是字节缓冲区。
有没有一种方法可以在不分配新字符串和/或复制字符数组的情况下将字节缓冲符转换为字符串?(也就是说,有没有办法将字符串的char[]值安全地指向字节缓冲区的byte[]hb?)
谢谢
Java的String
类是不可变的。为了保持这种保证,String
必须有自己对支持它的char[]
的引用,并且其他人不能有这个引用。如果它要与ByteBuffer
共享一个数组,则String
类不能保证它不会被修改,此外,char
和byte
在Java中是不一样的。
将字节缓冲符转换为字符串的一种方法是使用字符集对字节进行解码:
Charset charset = Charset.forName("ISO-8859-1");
ByteBuffer m_buffer = ...;
String text = charset.decode(m_buffer).toString();
解码会创建一个CharBuffer
,您可以方便地将其转换为字符串
。您可以重用字符集
,它是线程安全的。我不会太担心性能(即“最快方式”),除非你在这方面真的有问题。一般的建议是,当你想使用ByteBuffer时,尽可能晚地进行到字符串的转换,并且只在需要字符串的时候进行。
正如14jbella提到的,字符串是不可变的。由于数组是可变的,因此无法从不包含复制数据的数组(字符或字节)创建字符串。所以不,没有复制就没有办法做到。
此外,您应该考虑到,m_buffer.array()
返回ByteBuffer
的内部数组,该数组可能比存储在缓冲区中的实际数据多得多。从该数组创建String可能会导致潜在的巨大内存分配,因为数据会被复制到新数组中。例如,如果您在代码中的某个地方使用了256 MB的ByteBuffer,并且您从该缓冲区获得了一个名为m_buffer
的32字节的片
来转换为String,那么您对new String(<--plhd--1)的调用/>())
将分配一个新的字节数组,其大小与原始的支持字节数组相同,即256 MB,如果需要GC,这可能不会那么快。
顺便说一句,new String(byte[])
在内部使用一个CharSet
解码器,该解码器位于一个围绕输入字节数组的ByteBuffer
上。
用这种方式将字节缓冲符转换为字符串是否正确, 我问这个问题的原因是,这看起来太简单了,而像Java这样的其他方法:将字符串转换成字节缓冲符和相关问题看起来更复杂。
协议缓冲区说它可以包含任何任意的字节序列。但是如果我的数据包含“\0”,协议缓冲区如何从字符串变量对我的整个数据进行编码。
问题内容: 在Java中,如果我有一个String ,如何计算该字符串中的字节数? 问题答案: 字符串是字符列表(即代码点)。表示字符串所用的字节数完全取决于你使用哪种编码将其转换为字节。 也就是说,你可以将字符串转换为字节数组,然后按如下所示查看其大小: 因此,你看到,即使是简单的“ ASCII”字符串,其表示形式也可以具有不同数量的字节,具体取决于所使用的编码。使用你感兴趣的字符集作为的参数。
问题内容: 这个: 这样做(是空字节): 问题答案: Go的syscall程序包中隐藏了该函数,该函数查找第一个空字节([] byte {0})并返回长度。我假设它被称为C-Length。 抱歉,我迟到了一年,但是我认为它比其他两个 要 简单得多(没有不必要的输入等)。 所以, ^的意思是设置为从头到索引处的字节片。 结果将为3。
问题内容: 我试图理解一个到字符串,一个的字符串表示形式到转换…我将我的转换成一个要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显给客户端。 当我从Java应用程序发送数据时… 字节发送.. 发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示形式,该数据将通过电线发送): 在python端,python服务器将字符串返回给调用方(我可以
本文向大家介绍Java中的字符串缓冲区和字符串生成器之间的区别,包括了Java中的字符串缓冲区和字符串生成器之间的区别的使用技巧和注意事项,需要的朋友参考一下 字符串缓冲区和StringBuilder都是可变类,可用于对字符串对象执行操作,例如字符串的反向,压缩字符串等。我们可以在不创建字符串新对象的情况下修改字符串。字符串缓冲区是线程安全的,而字符串生成器不是线程安全的。因此,它比字符串缓冲区快