web-dev-qa-db-fra.com

console.writeline et System.out.println

Quelle est exactement la différence technique entre console.writeline et 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 pour console.writeline.

114
ziggy

Voici les principales différences entre System.out_/_.err_/_.in et System.console() :

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

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

Notez que ce comportement dépend du codage de la console défini sur un codage différent de celui du système. Ceci est le comportement par défaut sous Windows pour un tas de raisons historiques.

120
McDowell

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 Console existe pour fournir des fonctionnalités 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 à faire sur plusieurs plates-formes)
  • synchronisation (plusieurs threads peuvent demander une entrée et Console les placera correctement dans une file d'attente, alors que si vous utilisiez System.in/out, toutes les invites s'afficheraient simultanément).

Notez qu'au-dessus de cette redirection même n des flux, System.console() renvoie null; une autre irritation est qu’il n’ya souvent aucun objet Console disponible dans un autre programme tel que Eclipse ou Maven.

15
SimonJ

Premièrement, je crains que votre question ne comporte une petite erreur. Il n'y a pas de méthode writeeline dans la classe Console. Au lieu de cela, la classe Console fournit une méthode writer () qui renvoie PrintWriter. Ce graveur 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 est indisponible, System.console () renvoie la valeur null tant que System.out existe toujours. Cela peut arriver 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 lancé 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 au 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 aideront.

7
AlexR

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

La console et la sortie standard ne sont pas identiques. Si vous lisez la page Javadoc vous mentionné , vous verrez qu'une application peut accéder à une console uniquement si elle est appelée à partir de la ligne de commande et si le résultat n'est pas redirigé de cette manière.

Java -jar MyApp.jar > MyApp.log

La réponse de SimonJ couvre d'autres cas similaires, bien qu'il ait oublié le fait qu'il n'y a pas de Console.writeline.

3
Nithesh Chandra