web-dev-qa-db-ger.com

Schreiben auf die Konsole mit System.out und PrintWriter

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?

26

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.

16

unterschiedlich von zwei Ansatz ist:

  • Wenn Sie 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:

    1. PrintStream ist ein Strom von Bytes, während PrintWrite ein Strom von Zeichen ist.
    2. 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.

17
Sam

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)
2
Clay

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.

2
Chandra Sekhar

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.

2
bmkorkut

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. 

1
user3317919