117 votes

console.writeline et System.out.println

Quelle est la différence technique exacte entre console.writeline y System.out.println ? Je sais que System.out.println écrit sur la sortie standard mais n'est-ce pas la même chose que la console ?

Je ne comprends pas bien le documentation para console.writeline .

126voto

McDowell Points 62645

Voici les principales différences entre l'utilisation System.out / .err / .in y System.console() :

  • System.console() retourne null si votre application n'est pas exécutée dans un terminal ( mais vous pouvez gérer cela dans votre application )
  • System.console() fournit des méthodes pour lire le mot de passe sans écho des caractères
  • System.out y System.err utilisent l'encodage par défaut de la plate-forme, tandis que les Console Les méthodes de sortie de la classe utilisent l'encodage de la console

Ce dernier comportement peut ne pas être immédiatement évident, mais un code comme celui-ci peut démontrer la différence :

public class ConsoleDemo {
  public static void main(String[] args) {
    String[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", 
        "\u2502Hello\u2502",
        "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" };
    for (String s : data) {
      System.out.println(s);
    }
    for (String s : data) {
      System.console().writer().println(s);
    }
  }
}

Sur mon Windows XP qui a un encodage système de Windows-1252 et un encodage de console par défaut de IBM850, ce code s'écrira :

???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘

Notez que ce comportement dépend de l'encodage de la console, qui doit être différent de l'encodage du système. Il s'agit du comportement par défaut sous Windows pour un certain nombre de raisons historiques.

15voto

SimonJ Points 10072

Ils sont essentiellement les mêmes, si votre programme est exécuté depuis une invite interactive et que vous n'avez pas redirigé stdin ou stdout :

public class ConsoleTest {
    public static void main(String[] args) {
        System.out.println("Console is: " + System.console());
    }
}

résulte dans :

$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null

La raison Console existe pour fournir des fonctionnalités qui sont utiles dans le cas spécifique où vous êtes exécuté à partir d'une ligne de commande interactive :

  • saisie sécurisée du mot de passe (difficile à réaliser sur une plateforme croisée)
  • la synchronisation (plusieurs threads peuvent solliciter des entrées et des Console les mettra en file d'attente, alors que si vous utilisez System.in/out, toutes les invites apparaîtront simultanément).

Remarquez ci-dessus que le fait de rediriger même un des flux se traduit par System.console() en retournant sur null Une autre irritation est qu'il n'y a souvent pas de système d'alerte. Console disponible lorsqu'il est lancé à partir d'un autre programme tel qu'Eclipse ou Maven.

7voto

AlexR Points 60796

Tout d'abord, je crains que votre question ne contienne une petite erreur. Il n'y a pas de méthode writeline dans la classe Console. Au lieu de cela, la classe Console fournit la méthode writer() qui renvoie PrintWriter. Cet écrivain d'impression a println().

Maintenant, quelle est la différence entre

System.console().writer().println("hello from console");

et

System.out.println("hello system out");

Si vous exécutez votre application en ligne de commande, je pense qu'il n'y a pas de différence. Mais si la console n'est pas disponible, System.console() renvoie null alors que System.out existe toujours. Cela peut arriver si vous invoquez votre application et effectuez une redirection de STDOUT vers un fichier.

Voici un exemple que je viens de mettre en œuvre.

import java.io.Console;

public class TestConsole {
    public static void main(String[] args) {
        Console console = System.console();
        System.out.println("console=" + console);
        console.writer().println("hello from console");
    }
}

Lorsque j'ai lancé l'application à partir de l'invite de commande, j'ai obtenu le résultat suivant :

$ java TestConsole
console=java.io.Console@93dcd
hello from console

mais quand j'ai redirigé le STDOUT vers un fichier...

$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
        at TestConsole.main(TestConsole.java:8)

La ligne 8 est console.writer().println() .

Voici le contenu de /tmp/test

console=null

J'espère que mes explications vous aideront.

3voto

Nithesh Chandra Points 1232

Il n'y a pas Console.writeline en Java. C'est en .NET.

La console et la sortie standard ne sont pas les mêmes. Si vous lisez la page Javadoc, vous mentionné vous verrez qu'une application ne peut avoir accès à une console que si elle est invoquée depuis la ligne de commande et que la sortie n'est pas redirigée comme ceci

java -jar MyApp.jar > MyApp.log

D'autres cas de ce type sont couverts dans la réponse de SimonJ, bien qu'il ait omis de préciser qu'il n'y a pas d'obligation d'utiliser un système de gestion de la qualité. Console.writeline .

0voto

dwbFrank Points 31

System.out fait référence à une instance de PrintStream.

System.console.writer fait référence à une instance de PrintWriter.

Voir System.out.println vs PrintWriter

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X