9

指定した CharSet を使用して CharSequence を OutputStream に書き込みたい。基本的に、 write(String) が呼び出されたときに、同じ CharSet で初期化された Writer が行うことです。

問題は、多くの CharSequences を書き込む必要があり、一部はかなり大きいことです。さらに複雑なことに、すべてが複数の OutputStream に書き込まれる可能性があります。を使用して簡単に実装できます(実際には、現在そのように実装しています):

byte[] rawBytes = CharSequence.toString().getBytes(CharSet)
for (OutputStream out : outputTargets) {
    out.write(rawBytes);
}

しかし明らかに、文字列はここでは完全に不要なガベージ オブジェクトであり、byte[] 配列もそうです。中間オブジェクトなしで直接エンコードできる方法を探しています。驚くべきことに、これは不可能なようです - JRE で CharSequence が受け入れられているところを見たところ、作業が完了する前にすぐに String に変換されます。

CharSet の変換作業のほとんど (すべて?) は非パブリック クラスで行われているようです。

どうすればガベージを回避できますか/JREのCharSetエンコーディング機能を直接使用できますか?

4

2 に答える 2

6

シーケンスの文字を反復処理し、それらをライターに書き込みます。

OutputStream outputStream = ....
CharSequence charSequence = ....
Charset charset = ....

Writer writer = new OutputStreamWriter(outputStream, charset);

for (int i = 0; i < charSequence.length(); i++) {
    writer.write(charSequence.charAt(i));
}
于 2013-08-29T15:22:45.620 に答える