ByteBuffer.asCharBuffer()バイトが UTF-16 であると仮定します。(これを明示的に述べているドキュメントは見つかりませんが、実装ではバイトのペアを char の下位バイトと上位バイトとして扱うだけです。)別のエンコーディングが必要な場合は、別のアプローチを使用する必要があります。
最も簡単な方法は、以下を作成することStringです:
CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));
「新しい文字列の作成を回避しようとしている」と言ったことは知っていますが、コードスニペットはとにかく別のバイト配列を割り当てていました(ByteArrayOutputStream.toByteArray()ドキュメントによると「新しく割り当てられたバイト配列を作成します」)。はランダム アクセスをサポートし、多くのエンコーディング (特に UTF-8) は可変幅であるためCharBuffer、とにかく前もって全体を char に変換するのがおそらく最善です。
文字へのストリーミング アクセス (ランダム アクセスでCharBufferはなく) が本当に必要な場合は、基になるコードが受け入れるのに最適なインターフェイスではない可能性があります。