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.



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.


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.


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.


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.


Ouais - J'ai pensé que le compilateur de ziggy (ou les Javadocs) pourrait faire ce travail pour moi :)
SimonJ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.