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.

 102
Author: Jean-François Corbett, 2010-10-23

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 i System.err używają domyślnego kodowania platformy, podczas gdy metody wyjścia klasy Console 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.

 109
Author: McDowell,
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.

 12
Author: SimonJ,
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ą.
 5
Author: AlexR,
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.

 2
Author: Nithesh Chandra,
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