web-dev-qa-db-fra.com

Écrire sur la console avec System.out et PrintWriter

En lisant sur Java I/O, j'ai réalisé qu'il y avait deux façons d'écrire sur la sortie standard. 

Voici l'extrait qui utilise les deux techniques

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

Y a-t-il des avantages en termes de performances à utiliser l'un par rapport à l'autre?

26
Chander Shivdasani

Un rapide Google a révélé un fil sur Coderanch qui était utile.

Il existe plusieurs autres façons d’écrire sur la console, mais il ne semble pas y avoir de réel avantage à utiliser l’une ou l’autre, si ce n’est moins de code à écrire et que la création d’un nouvel objet PrintWriter occupera éventuellement plus de mémoire.

PrintWriter peut écrire dans des sources autres que la console, il peut écrire dans un HttpResponse, par exemple, alors que System.out.println écrit uniquement dans la console.

16
Henrik Andersson

différente de deux approche est:

  • Lorsque vous utilisez System.out.print(""), vous avez réellement utilisé une instance PrintStream.
  • En fait, la différence est dans deux classes PrintStream et PrintWriter qui sont:

    1. PrintStream est un flux d'octets alors que PrintWrite est un flux de caractères.
    2. PrintStream utilise le codage par défaut de la plate-forme alors qu'avec la PrintWriter, vous pouvez toutefois transmettre un OutputStreamWriter avec un codage spécifique. pour exemple: PrintStream stream = new PrintStream(output);PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Vous pouvez sélectionner une approche avec vos exigences.

14
Sam

En fonction du nombre d'E/S que vous allez effectuer, l'utilisation d'un tampon peut présenter de nombreux avantages. Idéalement, vous devriez limiter le nombre d'appels à votre source d'entrée et lire les octets sous forme de morceaux. 

Imaginez un seau avec 10 cailloux et vous voulez les déplacer dans un autre seau. Vous pouvez prendre une poignée de cailloux et les déplacer. Vous n'avez pas besoin d'aller chercher une pelle, c'est trop de frais généraux. Mais si le seau contient des milliers de cailloux, vous voudrez une pelle, et cela vaut la peine de chercher la pelle (dans cette analogie, le tampon est la pelle) ... La morale de l'histoire est que vous devrait utiliser un tampon lorsque vous allez passer de nombreux appels à la source de données. 

Cet article pourrait mieux l'expliquer et plus en détail ... http://pzemtsov.github.io/2015/01/19/on-the-benefits-of-stream-buffering-in-Java.html

Voici un lien vers le site Web d'Oracle expliquant le fonctionnement de la classe PrintWriter. https://docs.Oracle.com/javase/7/docs/api/Java/io/PrintWriter.html

Voici un exemple de travail ... Vous pouvez utiliser la classe PrintWriter pour écrire sur la console si vous instanciez l'objet avec System.in. Veillez également à indiquer "true" afin que le vidage automatique soit effectué. 

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

Voici la sortie:

ID: 12456 (John, Lennon)
ID:   323 (Paul, McCartney)
ID:   345 (George, Harrison)
ID:  3423 (Ringo, Star)
2
Clay

Il n'y a pas que deux façons, vous pouvez également trouver d'autres façons de le faire. Par exemple, en utilisant la classe Consol du paquet io, et d’autres classes peuvent présenter cela.

Mais si vous voulez juste imprimer quelque chose dans la console, alors je pense que la première méthode est la meilleure. Pourquoi devriez-vous aller pour 4 à 5 lignes de code si cela peut être fait en une seule ligne.

2
Chandra Sekhar

Utilisation:

System.out.println("Method 1");

C'est un appel statique qui est plus rapide que l'autre option. De plus, vous ne créez aucun objet supplémentaire tel qu'un objet PrinterWriter dans la deuxième option.

2
bmkorkut

L'utilisation de PrintWriter rend la sortie internationalisable, car des codages tels que UTF-8 peuvent être spécifiés. Les classes PrintWriter et PrintStream ne doivent être utilisées que pour des activités telles que la sortie console - pas pour la programmation réseau - en raison de leur traitement dépendant de la plate-forme des sauts de ligne et de l'ingestion de conditions d'exception. Le deuxième chapitre de "Java Network Programming" contient une bonne discussion à ce sujet. 

1
user3317919