2010-10-23 14 views
91

¿Cuál es exactamente la diferencia técnica entre console.writeline y System.out.println? Sé que System.out.println escribe a la salida estándar pero ¿no es esto lo mismo que la consola?console.writeline y System.out.println

No entiendo completamente documentation para console.writeline.

+1

Consulte http://stackoverflow.com/questions/2369731/java-console-applications-is-system-out-still-the-way-to-go –

+3

también console.writeline no es un método de Java (es .net) ... pero entiendo lo que estás preguntando :) –

Respuesta

100

Estas son las principales diferencias entre el uso de System.out/.err/.in y :

  • System.console() devuelve null si la aplicación no se ejecuta en un terminal (though you can handle this in your application)
  • System.console() proporciona métodos para la lectura de contraseña sin reflejar personajes
  • System.out y System.err utilizan la codificación de plataforma predeterminada, mientras que los métodos de salida de clase Console usan la consola que codifica

Este último comportamiento puede no ser inmediatamente obvio, pero el código como este puede demostrar la diferencia:

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); 
    } 
    } 
} 

en mi Windows XP que tiene un sistema de codificación de las ventanas-1252 y una codificación defecto de la consola IBM850, este código escribirá:

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

Tenga en cuenta que este comportamiento depende de la codificación de la consola se establece en una codificación diferente a la codificación del sistema. Este es el comportamiento predeterminado en Windows por una serie de razones históricas.

+0

¿Puedes ver un ejemplo de no correr en una terminal? – Chao

+0

@Richard, si presionas ejecutar desde un IDE, o si ejecutas un archivo ejecutable desde una GUI. – aioobe

10

Son esencialmente la misma, si el programa se ejecuta desde un símbolo interactivo y no se ha redirigido la entrada estándar o la salida estándar:

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

resultados en:

$ java ConsoleTest 
Console is: [email protected] 
$ java ConsoleTest </dev/null 
Console is: null 
$ java ConsoleTest | cat 
Console is: null 

La razón Console existe es proporcionar funciones que son útiles en el caso específico de que se ejecute desde una línea de comando interactiva:

  • entrada de contraseña segura (difícil de hacer multiplataforma)
  • sincronización (varios subprocesos pueden solicitar entrada y Console los pondrá en cola muy bien, mientras que si utilizó System.in/out, todas las solicitudes aparecerían simultáneamente).

Aviso por encima de ese redireccionamiento aun uno de los Resultados de los flujos de System.console() regresar null; Otra irritación es que a menudo no hay ningún objeto Console disponible cuando se genera desde otro programa como Eclipse o Maven.

2

No hay Console.writeline en Java. Está en .NET.

La consola y la salida estándar no son iguales. Si usted lee la página Javadoc que mentioned, se verá que una aplicación puede tener acceso a una consola sólo si se invoca desde la línea de comandos y la salida no se redirige al igual que esta

java -jar MyApp.jar > MyApp.log 

están cubiertos Otros de estos casos en la respuesta de SimonJ, aunque se perdió el punto de que no hay Console.writeline.

+0

Sí, creo que el compilador de ziggy (o los Javadocs) podría hacer ese trabajo por mí :) – SimonJ

5

Primero, me temo que su pregunta contiene un pequeño error. No hay método writeline en la clase Console. En cambio, la clase Console proporciona el método writer() que devuelve PrintWriter. Este escritor de impresión tiene println().

Ahora ¿cuál es la diferencia entre

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

y

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

Si se ejecuta la aplicación desde la línea de comandos Creo que no hay ninguna diferencia. Pero si la consola no está disponible, System.console() devuelve null mientras System.out todavía existe. Esto puede suceder si invoca su aplicación y realiza la redirección de STDOUT al archivo.

Aquí hay un ejemplo que acabo de implementar.

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"); 
    } 
} 

Cuando me encontré con la aplicación de línea de comandos que tiene el siguiente:

$ java TestConsole 
[email protected] 
hello from console 

pero cuando me redirecciona la salida estándar al archivo ...

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

línea 8 es console.writer().println().

Aquí es el contenido de/tmp/test

console=null 

espero que mis explicaciones ayudan.

+0

Para hacer que el código se muestre como bloques de código, sangra cada línea con cuatro espacios. (Sin embargo, lo he hecho por ti). – BoltClock

+0

Sin embargo, hay Console.printf y Console.format, que escriben directamente, sin necesidad de extraer el PrintWriter intermedio. Weird :) –

Cuestiones relacionadas