Qual è esattamente la differenza tecnica tra console.writeline
e System.out.println
?
So che System.out.println
scrive sullo standard output, ma non è la stessa cosa della console?
Non capisco completamente la documentazione per console.writeline
.
Sono essenzialmente gli stessi, se il vostro programma viene eseguito da un prompt interattivo e non avete reindirizzato stdin o stdout:
public class ConsoleTest {
public static void main(String[] args) {
System.out.println("Console is: " + System.console());
}
}
risulta in:
$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null
La ragione per cui esiste la Console
è quella di fornire caratteristiche che sono utili nel caso specifico in cui si venga eseguiti da una linea di comando interattiva:
Console
li metterà in coda, mentre se si usasse System.in/out allora tutti i messaggi apparirebbero simultaneamente).Notate sopra che reindirizzare anche solo uno dei flussi risulta in System.console()
che restituisce null
; un'altra irritazione è che spesso non c'è un oggetto Console
disponibile quando viene generato da un altro programma come Eclipse o Maven.
Per prima cosa temo che la tua domanda contenga un piccolo errore. Non c'è un metodo writeline nella classe Console. Invece la classe Console fornisce il metodo writer() che restituisce PrintWriter. Questo scrittore di stampa ha println().
Ora qual è la differenza tra
System.console().writer().println("hello from console");
e
System.out.println("hello system out");
Se si esegue l'applicazione dalla riga di comando penso che non ci sia alcuna differenza. Ma se la console non è disponibile System.console() restituisce null mentre System.out esiste ancora. Questo può accadere se invochi la tua applicazione ed esegui il reindirizzamento di STDOUT su file.
Ecco un esempio che ho appena implementato.
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");
}
}
Quando ho eseguito l'applicazione dal prompt dei comandi ho ottenuto quanto segue:
$ java TestConsole
console=java.io.Console@93dcd
hello from console
ma quando ho reindirizzato lo STDOUT al file...
$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
at TestConsole.main(TestConsole.java:8)
La linea 8 è console.writer().println()
.
Ecco il contenuto di /tmp/test
console=null
Spero che le mie spiegazioni siano d'aiuto.
Non c'è Console.writeline
in Java. È in .NET.
Console e standard out non sono la stessa cosa. Se leggi la pagina Javadoc che hai citato, vedrai che un'applicazione può avere accesso a una console solo se è invocata dalla riga di comando e l'output non è reindirizzato come questo
java -jar MyApp.jar > MyApp.log
Altri casi simili sono coperti nella risposta di SimonJ'anche se ha tralasciato il punto che non c'è Console.writeline
.