mma*_*sta 10 java string bytearray stringbuffer
标题说明了一切.有没有办法从StringBuilder转换为byte []而不使用中间的String?
问题是我正在管理真正的大字符串(数百万个字符),然后我有一个循环,最后添加一个字符并获得字节[].将StringBuffer转换为String的过程使得这个循环非常非常慢.
有没有办法实现这个目标?提前致谢!
VGR*_*VGR 11
正如许多人已经建议的那样,你可以使用CharBuffer类,但是分配一个新的CharBuffer只会让你的问题变得更糟.
相反,您可以直接将StringBuilder包装在CharBuffer中,因为StringBuilder实现了CharSequence:
Charset charset = StandardCharsets.UTF_8;
CharsetEncoder encoder = charset.newEncoder();
// No allocation performed, just wraps the StringBuilder.
CharBuffer buffer = CharBuffer.wrap(stringBuilder);
ByteBuffer bytes = encoder.encode(buffer);
Run Code Online (Sandbox Code Playgroud)
编辑: Duarte正确地指出该CharsetEncoder.encode
方法可能返回一个缓冲区,其后备阵列大于实际数据意义,其容量大于其限制.有必要从ByteBuffer本身读取,或从ByteBuffer中读取保证大小合适的字节数组.在后一种情况下,没有避免在内存中有两个字节副本,尽管很简单:
ByteBuffer byteBuffer = encoder.encode(buffer);
byte[] array;
int arrayLen = byteBuffer.limit();
if (arrayLen == byteBuffer.capacity()) {
array = byteBuffer.array();
} else {
// This will place two copies of the byte sequence in memory,
// until byteBuffer gets garbage-collected (which should happen
// pretty quickly once the reference to it is null'd).
array = new byte[arrayLen];
byteBuffer.get(array);
}
byteBuffer = null;
Run Code Online (Sandbox Code Playgroud)
对于初学者来说,您可能应该使用StringBuilder
,因为StringBuffer
同步开销通常是不必要的。
不幸的是,没有办法直接转到byte
s,但您可以将char
s 复制到数组中或从0
to迭代length()
并读取每个charAt()
。
归档时间: |
|
查看次数: |
8217 次 |
最近记录: |