console.writeline et System.out.println

120

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

Je ne comprends pas entièrement la documentation pour console.writeline.

ziggy
la source
6
console.writeline n'est pas non plus une méthode java (c'est .net) ... mais je comprends ce que vous demandez :)
robert_x44

Réponses:

130

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

  • System.console()renvoie null si votre application n'est pas exécutée dans un terminal ( bien que vous puissiez gérer cela dans votre application )
  • System.console() fournit des méthodes pour lire le mot de passe sans faire écho aux caractères
  • System.outet System.errutilisez le codage de plate-forme par défaut, tandis que les Consoleméthodes de sortie de classe utilisent le codage de 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 d'IBM850, ce code écrira:

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

Notez que ce comportement dépend de l'encodage de la console défini sur un encodage différent de l'encodage système. Il s'agit du comportement par défaut sur Windows pour un tas de raisons historiques.

McDowell
la source
Pouvez-vous obtenir un exemple de non-exécution dans un terminal?
Chao
@Richard, si vous appuyez sur Exécuter à partir d'un IDE, ou si vous lancez un fichier jar exécutable à partir d'une interface graphique.
aioobe
15

Ils sont essentiellement les mêmes, si votre programme est exécuté à partir d'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 en:

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

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

  • saisie de mot de passe sécurisée (difficile à faire sur plusieurs plateformes)
  • synchronisation (plusieurs threads peuvent demander des entrées et Console les mettre en file d'attente bien, alors que si vous avez utilisé System.in/out, toutes les invites apparaîtront simultanément).

Notez ci-dessus que la redirection même de l' un des flux entraîne un System.console()retour null; une autre irritation est qu'il n'y a souvent aucun Consoleobjet disponible lorsqu'il est généré par un autre programme tel qu'Eclipse ou Maven.

SimonJ
la source
7

Premièrement, je crains que votre question contienne une petite erreur. Il n'y a pas d'écriture de méthode dans la classe Console. Au lieu de cela, la classe Console fournit la méthode writer () qui renvoie PrintWriter. Ce graveur 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 à partir de la ligne de commande, je pense qu'il n'y a aucune différence. Mais si la console n'est pas disponible, System.console () renvoie null alors que System.out existe toujours. Cela peut se produire si vous appelez 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 exécuté l'application à partir de l'invite de commande, j'ai obtenu ce qui suit:

$ 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.

AlexR
la source
Pour que le code s'affiche sous forme de blocs de code, indentez chaque ligne avec quatre espaces. (Je viens de le faire pour vous, cependant.)
BoltClock
Il existe cependant un Console.printf et un Console.format, qui tous deux écrivent directement, sans avoir besoin d'extraire le PrintWriter intervenant. Weird :)
Toby Eggitt
3

Il n'y a pas Console.writelinede Java. C'est dans .NET.

La console et la sortie standard ne sont pas les mêmes. Si vous lisez la page Javadoc que vous avez mentionnée , vous verrez qu'une application ne peut avoir accès à une console que si elle est appelée à partir de 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 genre sont couverts dans la réponse de SimonJ, bien qu'il ait manqué le fait qu'il n'y en a pas Console.writeline.

Nithesh Chandra
la source
Ouais - J'ai pensé que le compilateur de ziggy (ou les Javadocs) pourrait faire ce travail pour moi :)
SimonJ