console.writeline ve System.out.println


120

Tam arasındaki teknik fark nedir console.writelineve System.out.println? Bunun System.out.printlnstandart çıktıya yazdığını biliyorum, ancak bu konsolla aynı şey değil mi?

Ben tam anlamıyorum belgeleri için console.writeline.



6
Ayrıca console.writeline bir java yöntemi değildir (bu .net) ... ama ne sorduğunuzu anlıyorum :)
robert_x44

Yanıtlar:


130

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ğlar
  • System.outve System.errsüre, varsayılan platformu kodlamayı kullanmak Consolesınıf çıkış yöntemleri konsol kodlamasını kullanır

Bu 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.


Bir terminalde çalışmama örneği alabilir misiniz?
Chao

@Richard, bir IDE'den çalıştır'a tıklarsanız veya bir GUI'den çalıştırılabilir bir jar başlatırsanız.
aioobe

15

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:

  • güvenli şifre girişi (çapraz platform yapmak zordur)
  • senkronizasyon (birden fazla iş parçacığı girdi isteyebilir ve Consoleonları 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 ConsoleEclipse veya Maven gibi başka bir programdan üretildiğinde genellikle hiçbir nesnenin bulunmamasıdır.


7

İ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.


Kodun kod blokları olarak görünmesini sağlamak için, her satırı dört boşlukla girin. (Yine de bunu sizin için yaptım.)
BoltClock

Bununla birlikte, her ikisi de, araya giren PrintWriter'ı çıkarmaya gerek kalmadan doğrudan yazan bir Console.printf ve bir Console.format vardır. Garip :)
Toby Eggitt

3

Console.writelineJava'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.


Evet - ziggy'nin derleyicisinin (veya Javadocs'un) bu işi benim için yapabileceğini düşündüm :)
SimonJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.