console.writeline и System.out.println - PullRequest
       5

console.writeline и System.out.println

111 голосов
/ 23 октября 2010

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

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

Ответы [ 4 ]

115 голосов
/ 23 октября 2010

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

  • System.console()возвращает ноль, если ваше приложение не запущено в терминале (, хотя вы можете справиться с этим в своем приложении )
  • 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 по ряду исторических причин.

14 голосов
/ 23 октября 2010

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

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

приводит к:

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

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

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

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

6 голосов
/ 23 октября 2010

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

Теперь, в чем разница между

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

и

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

Если вы запускаете приложение из командной строки, я думаю, что тамнет разницыНо если консоль недоступна, System.console () возвращает ноль, а 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
console=java.io.Console@93dcd
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

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

2 голосов
/ 23 октября 2010

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

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

java -jar MyApp.jar > MyApp.log

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...