Wat is precies het technische verschil tussen console.writeline
en System.out.println
?
Ik weet dat System.out.println
naar de standaarduitvoer schrijft, maar is dit niet hetzelfde als de console?
Ik begrijp de documentatie voor console.writeline
niet helemaal.
Zij'zijn in wezen hetzelfde, als uw programma wordt uitgevoerd vanaf een interactieve prompt en u'niet stdin of stdout hebt omgeleid:
public class ConsoleTest {
public static void main(String[] args) {
System.out.println("Console is: " + System.console());
}
}
resulteert in:
$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null
De reden dat Console
bestaat is om functies te bieden die nuttig zijn in het specifieke geval dat je'wordt uitgevoerd vanaf een interactieve opdrachtregel:
Console
zet ze netjes in de rij, terwijl als je System.in/out zou gebruiken alle prompts tegelijk zouden verschijnen).Merk hierboven op dat het omleiden van één van de streams resulteert in System.console()
dat null
teruggeeft; een andere irritatie is dat er vaak geen Console
object beschikbaar is als het vanuit een ander programma zoals Eclipse of Maven wordt gespawned.
Ten eerste ben ik bang dat je vraag een foutje bevat. Er is geen methode writeline in de klasse Console. In plaats daarvan heeft klasse Console methode writer() die PrintWriter teruggeeft. Deze printschrijver heeft println().
Wat is nu het verschil tussen
System.console().writer().println("hello from console");
en
System.out.println("hello system out");
Als je je applicatie vanaf de commandoregel uitvoert, is er volgens mij geen verschil. Maar als console niet beschikbaar is, retourneert System.console() null terwijl System.out nog steeds bestaat. Dit kan gebeuren als je je applicatie aanroept en een redirect van STDOUT naar een bestand uitvoert.
Hier is een voorbeeld dat ik zojuist heb geïmplementeerd.
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");
}
}
Toen ik de applicatie vanaf commando prompt uitvoerde kreeg ik het volgende:
$ java TestConsole
console=java.io.Console@93dcd
hello from console
maar toen ik de STDOUT omleidde naar een bestand...
$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
at TestConsole.main(TestConsole.java:8)
Lijn 8 is console.writer().println()
.
Hier is de inhoud van /tmp/test
console=null
Ik hoop dat mijn uitleg helpt.
Er'is geen Console.writeline
in Java. Wel in .NET.
Console en standaard uit zijn niet hetzelfde. Als je de Javadoc-pagina leest die je noemde, zul je zien dat een applicatie alleen toegang heeft tot een console als het wordt aangeroepen vanaf de opdrachtregel en de uitvoer niet wordt omgeleid zoals dit
java -jar MyApp.jar > MyApp.log
Andere dergelijke gevallen worden behandeld in SimonJ's antwoord, hoewel hij het punt over het hoofd zag dat er'geen Console.writeline
is.