2010-10-23 16 views
91

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?console.writeline e System.out.println

Non capisco completamente il documentation per console.writeline.

+1

Vedere http://stackoverflow.com/questions/2369731/java-console-applications-is-system-out-still-the-way-to-go –

+3

anche console.writeline non è un metodo java (è .net) ... ma ho capito cosa stai chiedendo :) –

risposta

100

Qui ci sono le principali differenze tra l'utilizzo System.out/.err/.in e :

  • System.console() restituisce null se l'applicazione non viene eseguito in un terminale (though you can handle this in your application)
  • System.console() fornisce metodi per la lettura di password senza caratteri echeggiano
  • System.out e System.err utilizzano la codifica di piattaforma predefinita, mentre i metodi di output di classe Console utilizzano la codifica console

Quest'ultimo comportamento può non essere immediatamente evidente, ma il codice come questo in grado di dimostrare la differenza:

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); 
    } 
    } 
} 

Sul mio Windows XP, che ha una codifica di sistema di windows-1252 e una codifica console di default di IBM850, questo codice scriverà:

??????? 
?Hello? 
??????? 
┌─────┐ 
│Hello│ 
└─────┘ 

noti che questo comportamento dipende dalla codifica console essendo impostata una codifica diversa alla codifica di sistema. Questo è il comportamento predefinito su Windows per un sacco di motivi storici.

+0

Puoi avere un esempio di non essere in esecuzione in un terminale? – Chao

+0

@Richard, se si preme eseguito da un IDE o se si avvia un jar eseguibile da una GUI. – aioobe

10

Sono essenzialmente la stessa, se il programma viene eseguito da un prompt interattivo e non è stato reindirizzato stdin o stdout:

public class ConsoleTest { 
    public static void main(String[] args) { 
     System.out.println("Console is: " + System.console()); 
    } 
} 

risultati in:

$ java ConsoleTest 
Console is: [email protected] 
$ java ConsoleTest </dev/null 
Console is: null 
$ java ConsoleTest | cat 
Console is: null 

Il motivo Console esiste è quello di fornire le caratteristiche che sono utili nel caso specifico che sei stato eseguito da una riga di comando interattivo:

  • immissione password sicura (difficile da eseguire su più piattaforme)
  • sincronizzazione (più thread possono richiedere input e Console li accodano bene, mentre se si utilizza System.in/out allora tutti i prompt appariranno simultaneamente).

comunicazione di cui sopra che reindirizzamento anche uno dei risultati torrenti in System.console() ritorno null; un'altra irritazione è che spesso non c'è nessun oggetto Console disponibile quando viene generato da un altro programma come Eclipse o Maven.

2

Non c'è Console.writeline in Java. È in .NET.

Console e standard non sono uguali. Se leggete la pagina di Javadoc si mentioned, vedrete che un'applicazione può avere accesso a una console solo se viene richiamato dalla riga di comando e l'uscita non viene reindirizzato come questo

java -jar MyApp.jar > MyApp.log 

Altri casi sono coperti nella risposta di SimonJ, anche se ha perso il punto sul fatto che non c'è lo Console.writeline.

+0

Yup - Ho capito che il compilatore di ziggy (o Javadocs) potrebbe fare quel lavoro per me :) – SimonJ

5

Per prima cosa ho paura che la tua domanda contenga un piccolo errore. Non c'è metodo writeline nella console di classe. Invece class Console fornisce method writer() che restituisce PrintWriter. Questo writer 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 da linea di comando Penso che non c'è 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 il seguente:

$ java TestConsole 
[email protected] 
hello from console 

ma quando ho reindirizzato lo STDOUT su file ...

$ java TestConsole >/tmp/test 
Exception in thread "main" java.lang.NullPointerException 
     at TestConsole.main(TestConsole.java:8) 

linea 8 è console.writer().println().

Ecco il contenuto di/tmp/test

console=null 

Spero che le mie spiegazioni aiutano.

+0

Per far sì che il codice si mostri come blocchi di codice, indentare ogni riga con quattro spazi. (L'ho appena fatto per te, però.) – BoltClock

+0

Esiste, tuttavia, una Console.printf e una Console.format, che scrivono entrambe direttamente, senza la necessità di estrarre PrintWriter. Stranamente :) –

Problemi correlati