Какова техническая разница между console.writeline
и System.out.println
?
Я знаю, что System.out.println
записывается на стандартный вывод, но разве это не то же самое, что консоль?
Я не полностью понимаю документацию для console.writeline
.
Какова техническая разница между console.writeline
и System.out.println
?
Я знаю, что System.out.println
записывается на стандартный вывод, но разве это не то же самое, что консоль?
Я не полностью понимаю документацию для console.writeline
.
Вот основные отличия между использованием 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 по нескольким историческим причинам.
Они по существу одинаковы, если ваша программа запускается из интерактивного приглашения и вы не перенаправляли 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.
Сначала я боюсь, что ваш вопрос содержит небольшую ошибку. В классе 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
Надеюсь, мои объяснения помогут.
В Java нет Console.writeline
. Его в .NET.
Консоль и стандарт не совпадают. Если вы прочитаете страницу Javadoc, вы , вы увидите, что приложение может иметь доступ к консоли, только если оно вызывается из командной строки и вывод не перенаправляется так:
java -jar MyApp.jar > MyApp.log
Другие подобные случаи рассматриваются в ответе Саймона, хотя он пропустил то, что там нет Console.writeline
.