funzionalità printf () in Java combinata con un CharBuffer o qualcosa del genere

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sono un po 'confuso qui.

Vorrei fare qualcosa del genere:

  1. crea un tipo di buffer in cui posso scrivere
  2. cancella il buffer
  3. usa una funzione simile a printf () più volte per aggiungere un mucchio di cose nel buffer sulla base di alcuni calcoli complicati che voglio fare solo una volta
  4. usa il contenuto del buffer e stampalo su diversi oggetti PrintStream
  5. ripetere i passaggi 2-4 se necessario

per esempio:.

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

Sembra avvolgere un PrintWriter around StringWriter sarà fare quello che voglio per l'oggetto sb sopra, tranne per il fatto che non esiste un metodo clear () . Suppongo che potrei creare un nuovo oggetto PrintWriter e StringWriter ogni volta attraverso il ciclo, ma sembra un dolore. (nel mio vero codice lo faccio in diversi punti, non solo una volta in un ciclo ...)

Ho anche usato molto java.nio.CharBuffer e altri buffer NIO, e questo sembra un approccio promettente, ma non sono sicuro di come poterli avvolgere con un oggetto che mi darà la funzionalità printf () .

qualche consiglio?

È stato utile?

Soluzione

ah: penso di averlo. Il Formatter class ha un metodo format () che è come printf () e può essere costruito per avvolgere qualsiasi tipo di oggetto che implementa Appendable . CharBuffer implementa Appendable e posso clear () o leggere il contenuto di CharBuffer se necessario.

Altri suggerimenti

Perché è difficile creare un nuovo buffer nel loop? Ecco a cosa serve il garbage collector. Ci dovrebbe essere comunque una nuova assegnazione sotto le coperte in clear ().

Se vuoi davvero implementare il tuo SuperBuffer, non sarebbe affatto difficile. Basta creare una sottoclasse di OutputStream con una funzione clear (), quindi avvolgerne uno PrintStream. Se lo desideri, puoi utilizzare un CharBuffer nel tuo super buffer.

Prendi in considerazione la creazione di una sottoclasse, TeeOutputStream, di OutputStream (o Writer) che contiene la tua serie di flussi e delegati. Quindi avvolgi il tuo stream con PrintStream (o PrintWriter) e chiama semplicemente printf () su di esso. Non c'è bisogno di un buffer temporaneo o altro:

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top