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.