Java:没有toString的StringBuffer到byte []

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)


chr*_*ke- 1

对于初学者来说,您可能应该使用StringBuilder,因为StringBuffer同步开销通常是不必要的。

不幸的是,没有办法直接转到bytes,但您可以将chars 复制到数组中或从0to迭代length()并读取每个charAt()