printf () Funktionalität in Java in Kombination mit einem CharBuffer oder so ähnlich

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin ein wenig verwirrt hier.

Ich möchte etwas tun:

  1. eine Art Puffer erzeuge ich in schreiben
  2. löschen Sie den Puffer
  3. verwenden, um eine printf () - Funktion wie mehrmals ein paar Sachen in den Puffer wollen einmal muss ich nur auf einige komplizierte Berechnungen anhängen
  4. Sie den Inhalt des Puffers verwenden und an mehrere PrintStream Objekte drucken
  5. wiederholen Sie die Schritte 2-4 nach Bedarf

z.

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

Es sieht ein Printwriter um String werden tun, was ich für das sb Objekt will oben, außer es keine clear() Methode ist. Ich glaube, ich könnte einen neuen Printwriter erstellen und String jedes Mal durch die Schleife widersprechen, aber das scheint wie ein Schmerz. (In meinem realen Code Ich tue dies in mehreren Orten, nicht nur einmal in einer Schleife ...)

Ich habe auch java.nio.CharBuffer und andere NIO puffert viel, und das scheint wie ein vielversprechender Ansatz, aber ich bin mir nicht sicher benutzt, wie ich sie mit einem Objekt wickeln kann, die mir printf() Funktionalität geben.

ein Rat?

War es hilfreich?

Lösung

ah: Ich glaube, ich habe es. Die Formatter Klasse hat eine format() Verfahren, das ist wie printf(), und es kann um eine beliebige Art von Objekt zu umhüllen aufgebaut sein, die Appendable implementiert. CharBuffer implementiert Appendable, und ich clear() oder auslesen kann den Inhalt des CharBuffer wie nötig.

Andere Tipps

Warum ist es ein Schmerz einen neuen Puffer in der Schleife zu schaffen? Das ist, was die Garbage Collector ist da. Es müßte eine neue Zuordnung unter der Decke in clear () ohnehin sein.

Wenn Sie wirklich Ihre SuperBuffer implementieren möchten, wäre es nicht so schwer, überhaupt sein. Erstellen Sie einfach eine Unterklasse von Outputstream mit einer klaren () Funktion, und dann eine Print um das wickelt. Sie könnten einen CharBuffer in Ihrem Super-Puffer verwenden, wenn man will.

Betrachten wir eine Unterklasse zu schaffen, TeeOutputStream, von Outputstream (oder Writer), die das Array von Bächen und Delegierten zu ihnen hält. Dann wickeln Sie Ihren Strom mit einem Print (oder Printwriter) und nur Aufruf printf () auf sich. Keine Notwendigkeit für einen temporären Puffer oder etwas:

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top