2017-04-14 14 views
0

バイトを直接ByteBufferに読み込み、元のバッファをbyte []配列に再配置せずにデコードして、メモリ割り当てを最小限に抑えたい。Java direct ByteBuffer - 文字をデコードする

したがって、StandardCharsets.UTF_8.decode()はヒープ上に新しい配列を割り当てるため、使用しないでください。

バイトをデコードする方法が固まっています。文字列をバッファに書き込んだ後、再度idを読み込む次のコードを考えてみましょう。

コード出力:

䡥汬漠 

どのように私はバッファをデコードすることができますか?

+2

「ByteBuffer」ではなく、「CharBuffer」を反転する必要があります。「CharBuffer」は反転された状態を継承しません。 – EJP

答えて

1

CharBufferのエンコードを指定することはできません。ここを参照してください:またWhat Charset does ByteBuffer.asCharBuffer() use?

、バッファが変更可能なので、私は...あなたがおそらく常にメモリの再割り当てを行わず不変であることからStringを作成することができますどのように表示されていない

+0

Johnに感謝しますが、私の質問はまだ成立しています。追加のメモリ割り当てをせずに直接ByteBufferから文字をデコードするにはどうすればよいですか? –

+0

あなたの質問は 'どのように直接CharBufferのエンコーディングを指定することができますか? 'です... – john16384

+0

IMHOこれはコメントでなければなりません。 – glee8e

1

バイトを直接ByteBufferに読み込み、元のバッファをbyte []配列に再ラップすることなくそれらをデコードして、メモリ割り当てを最小限に抑えたいと思います。

ByteBuffer.asCharBuffer()実際には両方のラッパーが同じ基本バッファーを共有しているため、実際には必要です。

この方法のjavadocは言う:

新しいバッファの位置はゼロになり、それはありませんが、その能力とその限界は、2つの

で割っこのバッファ内に残っているバイトの数となり明示的に言えば、CharBufferは、指定されたバッファに対してUTF-16文字エンコーディングを使用するというヒントです。 charbufferが使用しているエンコーディングを制御することはできないので、エンコーディングに文字バイトを書く必要はありません。

byteBuffer.put("Hello Dávid".getBytes(StandardCharsets.UTF_16)); 

あなたの印刷についての1つのことforループ。 CharBuffer.length()は、実際にはバッファの位置と限界の間にある残りの文字の数なので、CharBuffer.get()を呼び出すと減少します。したがって、get(int)を使用するか、forの終了条件をlimit()に変更する必要があります。

関連する問題