Pregunta

Estoy un poco confundido aquí.

Me gustaría hacer algo como esto:

  1. crear algún tipo de búfer en el que pueda escribir
  2. borrar el búfer
  3. 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
  4. use el contenido del búfer e imprímalo en varios objetos PrintStream
  5. 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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top