Tam arasındaki teknik fark nedir console.writeline
ve System.out.println
? Bunun System.out.println
standart çıktıya yazdığını biliyorum, ancak bu konsolla aynı şey değil mi?
Ben tam anlamıyorum belgeleri için console.writeline
.
Tam arasındaki teknik fark nedir console.writeline
ve System.out.println
? Bunun System.out.println
standart çıktıya yazdığını biliyorum, ancak bu konsolla aynı şey değil mi?
Ben tam anlamıyorum belgeleri için console.writeline
.
Yanıtlar:
System.out
/ .err
/.in
Ve kullanımı arasındaki temel farklar şunlardır System.console()
:
System.console()
Uygulamanız bir terminalde çalıştırılmazsa null döndürür ( bunu uygulamanızda halledebilirsiniz )System.console()
karakterleri yansıtmadan şifre okuma yöntemleri sağlarSystem.out
ve System.err
süre, varsayılan platformu kodlamayı kullanmak Console
sınıf çıkış yöntemleri konsol kodlamasını kullanırBu ikinci davranış hemen belli olmayabilir, ancak bunun gibi bir kod farkı gösterebilir:
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);
}
}
}
Windows-1252 sistem kodlamasına ve IBM850 varsayılan konsol kodlamasına sahip Windows XP'mde bu kod şöyle yazacaktır:
???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘
Bu davranışın, konsol kodlamasının sistem kodlamasına göre farklı bir kodlamaya ayarlanmasına bağlı olduğunu unutmayın. Bu, bir dizi tarihsel nedenden dolayı Windows'taki varsayılan davranıştır.
Programınız etkileşimli bir komut isteminden çalıştırılıyorsa ve stdin veya stdout'u yeniden yönlendirmediyseniz, bunlar esasen aynıdır:
public class ConsoleTest {
public static void main(String[] args) {
System.out.println("Console is: " + System.console());
}
}
sonuçlanır:
$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null
Bunun nedeni Console
, etkileşimli bir komut satırından çalıştırıldığınız belirli bir durumda yararlı olan özellikler sağlamaktır:
Console
onları güzelce sıraya koyacaktır, oysa System.in/out'u kullandıysanız, tüm istemler aynı anda görünecektir).Akışlardan birini bile yeniden yönlendirmenin System.console()
geri dönmeyle sonuçlandığına dikkat edin null
; Diğer bir rahatsızlık ise Console
Eclipse veya Maven gibi başka bir programdan üretildiğinde genellikle hiçbir nesnenin bulunmamasıdır.
İlk olarak, korkarım ki sorunuz küçük bir hata içeriyor. Console sınıfında yöntem yazımı yoktur. Bunun yerine sınıf Konsolu, PrintWriter döndüren yöntem yazıcı () sağlar. Bu yazıcı yazıcıda println () var.
Şimdi arasındaki fark nedir
System.console().writer().println("hello from console");
ve
System.out.println("hello system out");
Uygulamanızı komut satırından çalıştırırsanız bir fark olmadığını düşünüyorum. Ancak konsol kullanılamıyorsa System.console (), System.out hala mevcutken null döndürür. Bu, uygulamanızı çalıştırırsanız ve STDOUT'u dosyaya yeniden yönlendirirseniz gerçekleşebilir.
İşte yeni uyguladığım bir örnek.
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");
}
}
Uygulamayı komut isteminden çalıştırdığımda aşağıdakileri aldım:
$ java TestConsole
console=java.io.Console@93dcd
hello from console
ancak STDOUT'u dosyaya yeniden yönlendirdiğimde ...
$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
at TestConsole.main(TestConsole.java:8)
8. Satır console.writer().println()
.
İşte / tmp / test içeriği
console=null
Umarım açıklamalarım yardımcı olur.
Console.writeline
Java'da yok . NET içinde.
Konsol ve standart çıkış aynı değildir. Bahsettiğiniz Javadoc sayfasını okuduysanız, bir uygulamanın bir konsola ancak komut satırından çağrılması ve çıktının bu şekilde yeniden yönlendirilmemesi durumunda erişebileceğini göreceksiniz.
java -jar MyApp.jar > MyApp.log
SimonJ'nin cevabında bu tür diğer durumlar ele alınsa da, hayır olmadığı noktasını kaçırdı Console.writeline
.