Beim Lesen von Java I/O habe ich festgestellt, dass es zwei Möglichkeiten gibt, auf die Standardausgabe zu schreiben.
Es folgt ein Ausschnitt, der beide Techniken verwendet
import Java.io.*;
public class ConsoleIO {
public static void main(String[] args) {
System.out.println("Method 1");
PrintWriter writer = new PrintWriter(System.out);
writer.println("Method 2");
writer.flush();
writer.close();
}
}
Gibt es irgendwelche Leistungsvorteile bei der Verwendung eines Systems?
Ein schnelles Google enthüllte einen Thread auf Coderanch, der nützlich war.
Es gibt mehrere andere Möglichkeiten zum Schreiben von Konsolen, aber es scheint keinen echten Vorteil zu haben, den einen oder anderen zu verwenden, abgesehen von weniger Code zum Schreiben, und dass die Erstellung eines neuen PrintWriter-Objekts (möglicherweise) mehr Speicher beansprucht.
PrintWriter kann in andere Quellen als nur in die Konsole schreiben, beispielsweise in eine HttpResponse, während System.out.println nur in die Konsole schreibt.
unterschiedlich von zwei Ansatz ist:
System.out.print("")
verwenden, haben Sie tatsächlich eine PrintStream
-Instanz verwendet.Tatsächlich besteht der Unterschied in zwei Klassen PrintStream
und PrintWriter
, die sind:
PrintStream
ist ein Strom von Bytes, während PrintWrite
ein Strom von Zeichen ist.PrintStream
verwendet die Standardcodierung der Plattform, während Sie mit PrintWriter
einen OutputStreamWriter mit einer bestimmten Codierung übergeben können. Zum Beispiel: PrintStream stream = new PrintStream(output);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
Sie können einen Ansatz mit Ihren Anforderungen auswählen.
Je nachdem, wie viel I/O Sie ausführen, kann die Verwendung eines Puffers viele Vorteile haben. Im Idealfall sollten Sie die Anzahl der Aufrufe an Ihre Eingabequelle beschränken und die Bytes als Chunks einlesen.
Stellen Sie sich einen Eimer mit 10 Steinen vor, und Sie möchten sie in einen anderen Eimer verschieben. Sie könnten sich eine Handvoll Kieselsteine schnappen und sie einfach hinüberbewegen. Sie müssen nicht eine Schaufel nehmen, das ist zu viel. Aber wenn der Eimer Tausende von Kieseln hat, wollen Sie eine Schaufel haben, und es lohnt sich, die Schaufel zu bekommen (in dieser Analogie ist der Puffer die Schaufel) ... Die Moral der Geschichte ist die, dass Sie es sind sollte einen Puffer verwenden, wenn Sie viele Anrufe an die Datenquelle tätigen möchten.
Dieser Artikel kann es besser und ausführlicher erklären ... http://pzemtsov.github.io/2015/01/19/on-the-benefits-of-stream-buffering-in-Java.html
Hier ist ein Link zur Oracle-Website, in dem die Funktionsweise der PrintWriter-Klasse erläutert wird. https://docs.Oracle.com/javase/7/docs/api/Java/io/PrintWriter.html
Hier ein Arbeitsbeispiel ... Sie können die PrintWriter-Klasse verwenden, um in die Konsole zu schreiben, wenn Sie das Objekt mit System.in instanziieren. Stellen Sie sicher, dass Sie auch "true" eingeben, damit die Daten automatisch gelöscht werden.
import Java.io.*;
public class PrintWriterExample
{
public static void main(String args[]) throws IOException
{
int [] id = {12456, 323, 345, 3423};
String [] firstName = {"John", "Paul", "George", "Ringo"};
String [] lastName = {"Lennon", "McCartney", "Harrison", "Star"};
PrintWriter outFile = new PrintWriter(System.out, true);
String format = "ID: %5d (%s, %s)\n";
for (int i=0; i<id.length; i++)
{
outFile.printf(format, id[i], firstName[i], lastName[i]);
}
}
}
Hier ist die Ausgabe:
ID: 12456 (John, Lennon)
ID: 323 (Paul, McCartney)
ID: 345 (George, Harrison)
ID: 3423 (Ringo, Star)
Es gibt nicht nur zwei Möglichkeiten, es gibt auch andere Möglichkeiten, dies zu tun. Zum Beispiel mit Consol Klasse von Io-Paket, und möglicherweise einige weitere Klassen dafür vorhanden.
Wenn Sie aber nur etwas in der Konsole drucken möchten, dann denke ich, ist die erste Methode die beste. Warum sollten Sie 4 bis 5 Zeilen Code verwenden, wenn dies nur in einer Zeile möglich ist.
Benutzen:
System.out.println("Method 1");
Es ist ein statischer Anruf, der schneller als die andere Option ist. Außerdem erstellen Sie in der zweiten Option kein zusätzliches Objekt wie das PrinterWriter-Objekt.
Durch die Verwendung von PrintWriter wird die Ausgabe internationalisierbar - weil Kodierungen wie UTF-8 angegeben werden können. Sowohl die PrintWriter- als auch die PrintStream-Klasse sollten nur für Aktivitäten wie die Konsolenausgabe - nicht für die Netzwerkprogrammierung - verwendet werden, da sie plattformabhängig Zeilenumbrüche behandeln und Ausnahmebedingungen verschlucken. Das zweite Kapitel von "Java Network Programming" hat eine gute Diskussion darüber.