正如许多人已经建议的那样,你可以使用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);
编辑: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;