Funcionalidad printf () en Java combinada con un CharBuffer o algo similar
Pregunta
Estoy un poco confundido aquí.
Me gustaría hacer algo como esto:
- crear algún tipo de búfer en el que pueda escribir
- borrar el búfer
- use una función similar a printf () varias veces para agregar un montón de cosas al búfer en función de algunos cálculos complicados que solo quiero hacer una vez
- use el contenido del búfer e imprímalo en varios objetos
PrintStream
- repita los pasos 2-4 según sea necesario
por ejemplo:
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());
}
Parece como envolver un PrintWriter alrededor de StringWriter will hago lo que quiero para el objeto sb
anterior, excepto que no hay un método clear ()
. Supongo que podría crear un nuevo objeto PrintWriter y StringWriter cada vez a través del ciclo, pero eso parece un dolor. (en mi código real hago esto en varios lugares, no solo una vez en un bucle ...)
También he usado java.nio.CharBuffer
y otros buffers NIO mucho, y eso parece un enfoque prometedor, pero no estoy seguro de cómo puedo envolverlos con un objeto que me dará la funcionalidad printf ()
.
¿algún consejo?
Solución
ah: Creo que lo tengo. El Formatter
class tiene un método format ()
que es como printf ()
, y se puede construir para envolver cualquier tipo de objeto que implemente Appendable .
CharBuffer
implementa Appendable
, y puedo clear ()
o leer el contenido del CharBuffer
según sea necesario.
Otros consejos
¿Por qué es difícil crear un nuevo búfer en el bucle? Para eso está el recolector de basura. Debería haber una nueva asignación debajo de las cubiertas en clear () de todos modos.
Si realmente desea implementar su SuperBuffer, no sería tan difícil en absoluto. Simplemente cree una subclase de OutputStream con una función clear (), y luego envuelva un PrintStream alrededor de eso. Si lo desea, puede usar un CharBuffer en su súper búfer.
Considere crear una subclase, TeeOutputStream, de OutputStream (o Writer) que contenga su conjunto de secuencias y delegados a ellas. Luego, envuelva su transmisión con un PrintStream (o PrintWriter) y simplemente llame a printf () en él. No es necesario un buffer temporal ni nada:
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();
}