CharBufferまたはそれに類するものと組み合わせたJavaのprintf()機能
質問
ここで少し混乱しています。
次のようなことをしたい:
- 書き込み可能なバッファを作成する
- バッファをクリア
- 一度だけやりたい複雑な計算に基づいて、printf()のような関数を数回使用して、バッファに大量のものを追加します
- バッファの内容を使用して、いくつかの
PrintStream
オブジェクトに印刷します - 必要に応じて手順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();
}