printf () Funktionalität in Java in Kombination mit einem CharBuffer oder so ähnlich
Frage
Ich bin ein wenig verwirrt hier.
Ich möchte etwas tun:
- eine Art Puffer erzeuge ich in schreiben
- löschen Sie den Puffer
- verwenden, um eine printf () - Funktion wie mehrmals ein paar Sachen in den Puffer wollen einmal muss ich nur auf einige komplizierte Berechnungen anhängen
- Sie den Inhalt des Puffers verwenden und an mehrere
PrintStream
Objekte drucken - 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 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?
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();
}