console.writeline e System.out.println


120

Qual è esattamente la differenza tecnica tra console.writelinee System.out.println? So che System.out.printlnscrive sullo standard output ma non è la stessa cosa della console?

Non capisco completamente la documentazione per console.writeline.



6
anche console.writeline non è un metodo java (è .net) ... ma capisco cosa stai chiedendo :)
robert_x44

Risposte:


130

Ecco le principali differenze tra l'utilizzo di System.out/ .err/.in e System.console():

  • System.console()restituisce null se la tua applicazione non viene eseguita in un terminale ( sebbene tu possa gestirlo nella tua applicazione )
  • System.console() fornisce metodi per leggere la password senza ripetere i caratteri
  • System.oute System.errutilizzare la codifica della piattaforma predefinita, mentre i Consolemetodi di output della classe utilizzano la codifica della console

Quest'ultimo comportamento potrebbe non essere immediatamente ovvio, ma un codice come questo può 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 predefinita di IBM850, questo codice scriverà:

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

Notare che questo comportamento dipende dalla codifica della console impostata su una codifica diversa dalla codifica di sistema. Questo è il comportamento predefinito su Windows per una serie di ragioni storiche.


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

@Richard, se premi run da un IDE o se avvii un jar eseguibile da una GUI.
aioobe

15

Sono essenzialmente gli stessi, se il tuo programma viene eseguito da un prompt interattivo e non hai 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: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null

Il motivo Consoleesiste è fornire funzionalità utili nel caso specifico in cui si viene eseguiti da una riga di comando interattiva:

  • immissione sicura della password (difficile da fare multipiattaforma)
  • sincronizzazione (più thread possono richiedere input e Consoleli accoderanno bene, mentre se si utilizza System.in/out, tutti i prompt appariranno simultaneamente).

Si noti sopra che il reindirizzamento anche di uno dei flussi comporta la System.console()restituzione null; un'altra irritazione è che spesso non ci sono Consoleoggetti disponibili quando vengono generati da un altro programma come Eclipse o Maven.


7

Innanzitutto temo che la tua domanda contenga un piccolo errore. Non esiste una scrittura del metodo nella console di classe. Invece la classe Console fornisce il metodo writer () che restituisce PrintWriter. Questo scrittore di stampe ha println ().

Qual è la differenza tra

System.console().writer().println("hello from console");

e

System.out.println("hello system out");

Se esegui la tua applicazione dalla riga di comando, penso che non ci siano differenze. Ma se la console non è disponibile System.console () restituisce null mentre System.out esiste ancora. Ciò può accadere se si richiama la propria applicazione e si esegue 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.


Per fare in modo che il codice venga visualizzato come blocchi di codice, fai rientrare ogni riga con quattro spazi. (L'ho appena fatto per te, però.)
BoltClock

Esistono, tuttavia, Console.printf e Console.format, che scrivono entrambi direttamente, senza la necessità di estrarre il PrintWriter intermedio. Strano :)
Toby Eggitt

3

Non ce n'è Console.writelinein Java. È in .NET.

Console e uscita standard 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 viene invocata dalla riga di comando e l'output non viene reindirizzato in questo modo

java -jar MyApp.jar > MyApp.log

Altri casi simili sono trattati nella risposta di SimonJ, anche se ha perso il punto che non c'è Console.writeline.


Sì - immaginavo che il compilatore di ziggy (o i Javadoc) potesse fare quel lavoro per me :)
SimonJ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.