0

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

私はこのようなことをしたいと思います:

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

例えば:

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()

何かアドバイス?

4

3 に答える 3

3

ah:私はそれを持っていると思います。Formatterクラスにはのformat()ようなメソッドがprintf()あり、 を実装するあらゆる種類のオブジェクトをラップするように構築できますAppendableCharBufferを実装し、必要に応じて の内容を読み上げたりするAppendableことができます。clear()CharBuffer

于 2009-01-02T15:23:39.470 に答える
1

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

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

于 2009-01-02T15:23:40.420 に答える
0

ストリームの配列とデリゲートを保持する 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();
}
于 2009-01-03T01:46:13.520 に答える