Console.writeline и System.out.println

Какова техническая разница между console.writeline и System.out.println? Я знаю, что System.out.println записывается на стандартный вывод, но разве это не то же самое, что консоль?

Я не полностью понимаю документацию для console.writeline.

Ответ 1

Вот основные отличия между использованием System.out/.err/.in и System.console():

  • System.console() возвращает null, если ваше приложение не запускается в терминале (хотя вы можете справиться с этим в своем приложении)
  • System.console() предоставляет методы для чтения пароля без эхо-символов
  • System.out и System.err используют кодировку платформы по умолчанию, а методы вывода класса Console используют консольную кодировку

Это последнее поведение может быть не сразу очевидным, но такой код может продемонстрировать разницу:

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

В моей Windows XP, которая имеет системную кодировку Windows-1252 и стандартную консольную кодировку IBM850, этот код будет писать:

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

Обратите внимание, что это поведение зависит от того, что консольная кодировка установлена ​​на другую кодировку для системного кодирования. Это поведение по умолчанию в Windows по нескольким историческим причинам.

Ответ 2

Они по существу одинаковы, если ваша программа запускается из интерактивного приглашения и вы не перенаправляли stdin или stdout:

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

приводит к:

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

Причиной Console является предоставление функций, которые полезны в конкретном случае, который вы запускаете из интерактивной командной строки:

  • безопасный ввод пароля (трудно сделать кросс-платформенный)
  • синхронизация (несколько потоков могут запрашивать ввод, а Console будет хорошо их размещать в очереди, тогда как если бы вы использовали System.in/out, все подсказки появлялись одновременно).

Обратите внимание, что перенаправление даже одного из потоков приводит к возврату System.console() null; другое раздражение заключается в том, что часто нет объекта Console, доступного при создании из другой программы, такой как Eclipse или Maven.

Ответ 3

Сначала я боюсь, что ваш вопрос содержит небольшую ошибку. В классе Console не существует сценария метода. Вместо класса Console предоставляет метод writer(), который возвращает PrintWriter. У этого автора печати есть println().

В чем разница между

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

и

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

Если вы запускаете приложение из командной строки, я думаю, что нет никакой разницы. Но если консоль недоступна, System.console() возвращает значение null, пока System.out все еще существует. Это может произойти, если вы вызываете свое приложение и выполняете перенаправление STDOUT на файл.

Вот пример, который я только что внедрил.

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

Когда я запускал приложение из командной строки, я получил следующее:

$ java TestConsole
[email protected]
hello from console

но когда я перенаправил STDOUT в файл...

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

Строка 8 - console.writer().println().

Вот содержание /tmp/test

console=null

Надеюсь, мои объяснения помогут.

Ответ 4

В Java нет Console.writeline. Его в .NET.

Консоль и стандарт не совпадают. Если вы прочитаете страницу Javadoc, вы , вы увидите, что приложение может иметь доступ к консоли, только если оно вызывается из командной строки и вывод не перенаправляется так:

java -jar MyApp.jar > MyApp.log

Другие подобные случаи рассматриваются в ответе Саймона, хотя он пропустил то, что там нет Console.writeline.