CharBufferまたはそれに類するものと組み合わせたJavaのprintf()機能

StackOverflow https://stackoverflow.com/questions/407026

  •  03-07-2019
  •  | 
  •  

質問

ここで少し混乱しています。

次のようなことをしたい:

  1. 書き込み可能なバッファを作成する
  2. バッファをクリア
  3. 一度だけやりたい複雑な計算に基づいて、printf()のような関数を数回使用して、バッファに大量のものを追加します
  4. バッファの内容を使用して、いくつかの PrintStream オブジェクトに印刷します
  5. 必要に応じて手順2〜4を繰り返します

e.g。:

SuperBuffer sb = new SuperBuffer();
  /* SuperBuffer is not a real class, so I don't know what to use here */
PrintStream[] streams = new PrintStream[N];
/* ... initialize this array to several streams ... */

while (!done)
{
    sb.clear();
    sb.printf("something %d something %d something %d", 
        value1, value2, value3);
    if (some_complicated_condition())
        sb.printf("something else %d something else %d", value4, value5);
    /* ... more printfs to sb ... */
    for (PrintStream ps : streams)
        ps.println(sb.getBuffer());
}

PrintWriter StringWriter 周り上記の sb オブジェクトに対して必要なことを行いますが、 clear()メソッドはありません。ループを通るたびに新しいPrintWriterおよびStringWriterオブジェクトを作成できると思いますが、それは苦痛のようです。 (実際のコードでは、1回のループで1回だけでなく、複数の場所でこれを行います...)

java.nio.CharBuffer と他のNIOバッファーも多く使用しましたが、これは有望なアプローチのようですが、どのようにオブジェクトでラップできるかわかりません printf()機能が提供されます。

何かアドバイスはありますか

役に立ちましたか?

解決

ああ:私はそれを持っていると思う。 フォーマッタ クラスには printf()のような format()メソッドがあり、 Appendable CharBuffer Appendable を実装し、必要に応じて clear()または CharBuffer の内容を読み出すことができます。

他のヒント

ループ内に新しいバッファーを作成するのが苦痛なのはなぜですか?それがガベージコレクターの目的です。とにかくclear()のカバーの下に新しい割り当てが必要になります。

SuperBufferを本当に実装したい場合は、それほど難しくありません。 clear()関数を使用してOutputStreamのサブクラスを作成し、それをPrintStreamでラップするだけです。必要に応じて、スーパーバッファーでCharBufferを使用できます。

ストリームおよびデリゲートの配列を保持するOutputStream(またはWriter)のサブクラスTeeOutputStreamの作成を検討してください。次に、ストリームをPrintStream(またはPrintWriter)でラップし、printf()を呼び出します。一時バッファなどは必要ありません:

PrintStream[] streams = new PrintStream[N]; // any output streams really
PrintStream ps = new PrintStream(new TeeOutputStream(streams));

while (!done)
{
    ps.printf("something %d something %d something %d",
              value1, value2, value3);    
    if (some_complicated_condition())
        ps.printf("something else %d something else %d", value4, value5);
    ps.println();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top