console.writeline y System.out.println

120

¿Cuál es exactamente la diferencia técnica entre console.writeliney System.out.println? Sé que System.out.printlnescribe en la salida estándar, pero ¿no es lo mismo que la consola?

No entiendo completamente la documentación de console.writeline.

ziggy
fuente
6
también console.writeline no es un método java (es .net) ... pero entiendo lo que estás preguntando :)
robert_x44

Respuestas:

130

Estas son las principales diferencias entre usar System.out/ .err/.in y System.console():

  • System.console()devuelve nulo si su aplicación no se ejecuta en una terminal ( aunque puede manejar esto en su aplicación )
  • System.console() proporciona métodos para leer la contraseña sin hacer eco de caracteres
  • System.outy System.errusa la codificación de plataforma predeterminada, mientras que los Consolemétodos de salida de clase usan la codificación de la consola

Este último comportamiento puede no ser inmediatamente obvio, pero un 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 una codificación de sistema de windows-1252 y una codificación de consola predeterminada de IBM850, este código escribirá:

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

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

McDowell
fuente
¿Puede obtener un ejemplo de no ejecutarse en una terminal?
Chao
@Richard, si presionas ejecutar desde un IDE, o si lanzas un jar ejecutable desde una GUI.
aioobe
15

Son esencialmente lo mismo, si su programa se ejecuta desde un indicador interactivo y no ha redirigido stdin o stdout:

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

resulta en:

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

El motivo Consolees proporcionar funciones que sean útiles en el caso específico de que se esté ejecutando desde una línea de comandos interactiva:

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

Observe arriba que redirigir incluso una de las secuencias da como resultado el System.console()retorno null; otra irritación es que a menudo no hay ningún Consoleobjeto disponible cuando se genera desde otro programa como Eclipse o Maven.

SimonJ
fuente
7

Primero, me temo que su pregunta contiene un pequeño error. No hay una línea de escritura de métodos en la clase Console. En su lugar, la clase Console proporciona el método escritor () 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 ejecuta su aplicación desde la línea de comandos, creo que no hay diferencia. Pero si la consola no está disponible, System.console () devuelve nulo 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 ejecuté la aplicación desde el símbolo del sistema, obtuve lo siguiente:

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

pero cuando redirigí el STDOUT al archivo ...

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

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

Aquí está el contenido de / tmp / test

console=null

Espero que mis explicaciones ayuden.

AlexR
fuente
Para hacer que el código se muestre como bloques de código, sangra cada línea con cuatro espacios. (Sin embargo, acabo de hacer eso por ti).
BoltClock
Sin embargo, hay un formato Console.printf y un Console.format, los cuales escriben directamente, sin necesidad de extraer el PrintWriter intermedio. Extraño :)
Toby Eggitt
3

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

La consola y la salida estándar no son iguales. Si lee la página de Javadoc que mencionó , verá que una aplicación puede tener acceso a una consola solo si se invoca desde la línea de comando y la salida no se redirige así.

java -jar MyApp.jar > MyApp.log

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

Nithesh Chandra
fuente
Sí, pensé que el compilador de ziggy (o los Javadocs) podrían hacer ese trabajo por mí :)
SimonJ