すでに、あなたはCharBufferのクラスを使用しますが、新しいCharBufferのを割り当てることができます示唆しているとして、多くのあなたの問題を悪化させるだけです。 StringBuilderのはのCharSequenceを実装しているので
代わりに、あなたが直接、CharBufferの中であなたのStringBuilderをラップすることができます
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);
EDIT:ドゥアルテが正しく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;
出典
2013-10-19 23:30:34
VGR
最も近いものは、 'char []'配列を得ることです。 StringBuffer#getChars(int、int、char []、int) –
代わりに[CharBuffer](http://docs.oracle.com/javase/7/docs/api/java/nio/CharBuffer.html)を使用してみませんか?そして、 "charBuffer.array()"を実行しますか? – tolitius
これらの大きな文字列をすべてメモリに保存する必要がある理由を明確にすることはできますか?ユーザーが待っているのですか?これは代わりにMapReduceまたはSparkジョブになる可能性がありますか?おそらくこの質問が建築デザインの匂いの症状であるかどうかは不思議です。 – Vidya