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 la documentation de console.writeline .

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.out et System.err utilisent le codage de la plate-forme par défaut, 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(Ssortingng[] args) { Ssortingng[] data = { "\u250C\u2500\u2500\u2500\u2500\u2500\u2510", "\u2502Hello\u2502", "\u2514\u2500\u2500\u2500\u2500\u2500\u2518" }; for (Ssortingng s : data) { System.out.println(s); } for (Ssortingng 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 écrira:

 ??????? ?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 sur Windows pour un tas de raisons historiques.

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(Ssortingng[] args) { System.out.println("Console is: " + System.console()); } } 

résulte en:

 $ java ConsoleTest Console is: java.io.Console@2747ee05 $ java ConsoleTest  

La raison d'être de la Console est de fournir des fonctionnalités utiles dans le cas spécifique que vous exécutez depuis une ligne de commande interactive:

  • saisie de mot de passe sécurisée (difficile à faire multi-plateforme)
  • synchronisation (plusieurs threads peuvent demander l'entrée et la Console en queue bien, alors que si vous avez utilisé System.in/out, toutes les invites apparaissent simultanément).

Remarquez ci-dessus que redirect même l' un des stream a pour résultat que System.console() renvoie null ; Une autre source d’irritation est qu’il n’ya souvent pas d’object Console disponible lorsqu’il s’agit d’un autre programme tel que Eclipse ou Maven.

Je crains d’abord que votre question 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 est indisponible, System.console () renvoie null alors 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 oeuvre.

 import java.io.Console; public class TestConsole { public static void main(Ssortingng[] 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 reçu les informations suivantes:

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

mais quand j’ai redirigé le STDOUT pour classer …

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

Il n’y a pas de Console.writeline en 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 accéder à une console que si elle est appelée depuis la ligne de commande et que la sortie n’est pas redirigée comme ceci

 java -jar MyApp.jar > MyApp.log 

La réponse de SimonJ couvre d’autres cas de ce type, mais il a manqué le fait qu’il n’y a pas de Console.writeline .