konsola.writeline i System.Wynocha.println
Jaka dokładnie jest techniczna różnica między console.writeline
a System.out.println
?
Wiem, że System.out.println
pisze na standardowe wyjście, ale czy to nie to samo co konsola?
Nie do końca rozumiem dokumentację dla console.writeline
.
4 answers
Oto podstawowe różnice między używaniem System.out
/.err
/.in
oraz System.console()
:
-
System.console()
zwraca null, Jeśli aplikacja nie jest uruchomiona w terminalu (, chociaż możesz to zrobić w swojej aplikacji ) -
System.console()
zapewnia metody odczytu hasła bez echa znaków -
System.out
iSystem.err
używają domyślnego kodowania platformy, podczas gdy metody wyjścia klasyConsole
używają kodowania konsoli
Ten ostatni zachowanie może nie być od razu oczywiste, ale taki kod może wykazać różnicę: {]}
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);
}
}
}
Na moim Windows XP, który ma kodowanie systemowe windows - 1252 i domyślne kodowanie konsoli IBM850, kod ten będzie pisał:
???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘
Zauważ, że to zachowanie zależy od tego, czy kodowanie konsoli jest ustawione na inne kodowanie niż kodowanie systemowe. Jest to domyślne zachowanie w systemie Windows z kilku historycznych powodów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 19:38:35
Są zasadniczo takie same, jeśli twój program jest uruchamiany z interaktywnego monitu i nie masz przekierowania stdin lub stdout:
public class ConsoleTest {
public static void main(String[] args) {
System.out.println("Console is: " + System.console());
}
}
Wyniki w:
$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null
Powodem istnienia Console
jest dostarczenie funkcji przydatnych w konkretnym przypadku, w którym uruchamiane są z interaktywnego wiersza poleceń:
- Bezpieczne wprowadzanie hasła (trudne do zrobienia na wielu platformach)
- synchronizacja (wiele wątków może poprosić o wejście i
Console
ładnie ustawia je w kolejce, natomiast jeśli użyłeś System.in/out wtedy wszystkie monity pojawią się jednocześnie).
Zauważ powyżej, że przekierowanie nawet jednego strumieni skutkuje System.console()
zwróceniem null
; innym irytującym jest to, że często nie ma Console
obiektu dostępnego po wywołaniu z innego programu, takiego jak Eclipse lub Maven.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 19:12:21
Najpierw obawiam się, że twoje pytanie zawiera mały błąd. Nie ma metody WriteLine w klasie Console. Zamiast tego class Console dostarcza metodę writer (), która zwraca PrintWriter. Ten Print writer posiada funkcję println ().
Jaka jest różnica między
System.console().writer().println("hello from console");
I
System.out.println("hello system out");
Jeśli uruchamiasz aplikację z linii poleceń, myślę, że nie ma różnicy. Ale jeśli konsola jest niedostępna System.console () Zwraca wartość null while System.out nadal istnieje. Może się to zdarzyć, jeśli pacjent wywołaj swoją aplikację i wykonaj przekierowanie STDOUT do pliku.
Oto przykład, który właśnie zaimplementowałem.
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");
}
}
Po uruchomieniu aplikacji z wiersza polecenia otrzymałem:
$ java TestConsole
console=java.io.Console@93dcd
hello from console
Ale kiedy przekierowałem STDOUT do pliku...
$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
at TestConsole.main(TestConsole.java:8)
Linia 8 to console.writer().println()
.
Oto zawartość /tmp / test
console=null
Mam nadzieję, że moje wyjaśnienia pomogą.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 18:58:20
Nie ma Console.writeline
w Javie. Its in. NET.
Console i standard out nie są takie same. Jeśli przeczytasz stronę Javadoc, o której wspomniałeś , zobaczysz, że aplikacja może mieć dostęp do konsoli tylko wtedy, gdy jest wywoływana z linii poleceń, a wyjście nie jest przekierowywane w ten sposób
java -jar MyApp.jar > MyApp.log
Inne tego typu przypadki są opisane w odpowiedzi Simonja, choć nie zauważył, że nie ma Console.writeline
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 18:48:35