0

入力 ByteArrayOutputStream があり、それを CharBuffer に変換する必要があります。

新しい文字列の作成を避けようとしていました。とにかくこれを行うことはありますか。

私は次のことをしようとしていましたが、文字列のエンコーディングがないため、以下のコードは機能しません (無効な出力)。

ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();
4

3 に答える 3

2

エンコーディングを提供する必要があります。クラスはどのように変換するかを知る必要があります。ByteOutputStream に書き込む前、またはストリームを完全に回避する前に、エンコーディングを判断できませんか。そうでない場合は、仮定を行う必要があり、失敗する可能性があります

エンコーディングを提供すると、バイトバッファを文字バッファに変換できます

Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
于 2009-05-06T20:16:41.283 に答える
0

ByteBuffer.asCharBuffer両方のバッファに更新が反映された、非常に文字通りの 2 つbyteの to char(ビッグまたはリトル エンディアン) を提供します。

おそらく、合理的なエンコーディングを介して sからbytesに移動したいと考えています。charそれを行うには多くの方法があります。例えば ​​[new String(byte[], String encoding)][1]. ほとんどの場合、何らかの形でCharsetEncoderを通過します。次に、そこから a を取得するのは簡単CharBufferです。

CharBufferはかなり低レベルの種類のものです。それが本当にあなたが望むものだと確信していますか?

[1]: http://file:///C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte[] , java.lang.String)

于 2009-05-06T21:07:50.100 に答える
0

ByteBuffer.asCharBuffer()バイトが UTF-16 であると仮定します。(これを明示的に述べているドキュメントは見つかりませんが、実装ではバイトのペアを char の下位バイトと上位バイトとして扱うだけです。)別のエンコーディングが必要な場合は、別のアプローチを使用する必要があります。

最も簡単な方法は、以下を作成することStringです:

CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));

「新しい文字列の作成を回避しようとしている」と言ったことは知っていますが、コードスニペットはとにかく別のバイト配列を割り当てていました(ByteArrayOutputStream.toByteArray()ドキュメントによると「新しく割り当てられたバイト配列を作成します」)。はランダム アクセスをサポートし、多くのエンコーディング (特に UTF-8) は可変幅であるためCharBuffer、とにかく前もって全体を char に変換するのがおそらく最善です。

文字へのストリーミング アクセス (ランダム アクセスでCharBufferはなく) が本当に必要な場合は、基になるコードが受け入れるのに最適なインターフェイスではない可能性があります。

于 2009-05-06T21:11:28.050 に答える