console.writeline и System.out.println

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

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

5 ответов

Решение

Вот основные различия между использованием 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 по ряду исторических причин.

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

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() возврате null; Другое раздражение в том, что часто нет Console объект доступен при порождении из другой программы, такой как Eclipse или Maven.

Во-первых, я боюсь, что ваш вопрос содержит небольшую ошибку. В классе 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

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

Нет никаких Console.writeline на Яве. Это в.NET.

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

java -jar MyApp.jar > MyApp.log

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

System.outссылается на экземпляр PrintStream.

System.console.writerссылается на экземпляр PrintWriter.

См. System.out.println против PrintWriter

Другие вопросы по тегам