console.writeline dan System.out.println

120

Apa sebenarnya perbedaan teknis antara console.writelinedan System.out.println? Saya tahu bahwa System.out.printlnmenulis ke keluaran standar tetapi apakah ini tidak sama dengan konsol?

Saya tidak sepenuhnya memahami dokumentasi untuk console.writeline.

ziggy
sumber
6
juga console.writeline bukanlah metode java (ini adalah .net) ... tapi saya mengerti apa yang Anda tanyakan :)
robert_x44

Jawaban:

130

Berikut adalah perbedaan utama antara menggunakan System.out/ .err/.in dan System.console():

  • System.console()mengembalikan null jika aplikasi Anda tidak dijalankan di terminal ( meskipun Anda dapat menangani ini di aplikasi Anda )
  • System.console() menyediakan metode untuk membaca kata sandi tanpa menggemakan karakter
  • System.outdan System.errmenggunakan encoding platform default, sedangkan Consolemetode keluaran kelas menggunakan encoding konsol

Perilaku terakhir ini mungkin tidak langsung terlihat, tetapi kode seperti ini dapat menunjukkan perbedaannya:

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

Di Windows XP saya yang memiliki pengkodean sistem windows-1252 dan pengkodean konsol default IBM850, kode ini akan menulis:

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

Perhatikan bahwa perilaku ini bergantung pada encoding konsol yang disetel ke encoding berbeda ke encoding sistem. Ini adalah perilaku default di Windows karena banyak alasan historis.

McDowell
sumber
Dapatkan Anda mendapatkan contoh tidak berjalan di terminal?
Chao
@Richard, jika Anda menjalankan dari IDE, atau jika Anda meluncurkan jar yang dapat dieksekusi dari GUI.
aioobe
15

Mereka pada dasarnya sama, jika program Anda dijalankan dari prompt interaktif dan Anda belum mengarahkan stdin atau stdout:

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

menghasilkan:

$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null

Alasannya Consoleadalah untuk menyediakan fitur yang berguna dalam kasus tertentu yang Anda jalankan dari baris perintah interaktif:

  • entri kata sandi yang aman (sulit dilakukan lintas platform)
  • sinkronisasi (beberapa utas dapat meminta masukan dan Consoleakan mengantrekannya dengan baik, sedangkan jika Anda menggunakan System.in/out maka semua petunjuk akan muncul secara bersamaan).

Perhatikan di atas bahwa pengalihan bahkan salah satu aliran akan menghasilkan System.console()pengembalian null; Masalah lainnya adalah seringkali tidak ada Consoleobjek yang tersedia saat muncul dari program lain seperti Eclipse atau Maven.

SimonJ
sumber
7

Pertama, saya khawatir pertanyaan Anda mengandung sedikit kesalahan. Tidak ada metode writeline di konsol kelas. Sebaliknya konsol kelas menyediakan metode writer () yang mengembalikan PrintWriter. Penulis cetak ini memiliki println ().

Sekarang apa perbedaannya

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

dan

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

Jika Anda menjalankan aplikasi Anda dari baris perintah, saya rasa tidak ada perbedaan. Tetapi jika konsol tidak tersedia System.console () mengembalikan null sementara System.out masih ada. Ini mungkin terjadi jika Anda menjalankan aplikasi dan melakukan pengalihan STDOUT ke file.

Berikut adalah contoh yang baru saja saya terapkan.

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

Ketika saya menjalankan aplikasi dari command prompt saya mendapatkan yang berikut ini:

$ java TestConsole
console=java.io.Console@93dcd
hello from console

tetapi ketika saya mengarahkan STDOUT ke file ...

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

Baris 8 adalah console.writer().println().

Berikut adalah isi dari / tmp / test

console=null

Saya harap penjelasan saya membantu.

AlexR
sumber
Agar kode muncul sebagai blok kode, indentasi setiap baris dengan empat spasi. (Saya baru saja melakukannya untuk Anda.)
BoltClock
Namun, ada Console.printf, dan Console.format, keduanya menulis secara langsung, tanpa perlu mengekstrak PrintWriter yang mengganggu. Aneh :)
Toby Eggitt
3

Tidak ada Console.writelinedi Jawa. Ada di .NET.

Konsol dan standar tidak sama. Jika Anda membaca halaman Javadoc yang Anda sebutkan , Anda akan melihat bahwa aplikasi dapat memiliki akses ke konsol hanya jika dipanggil dari baris perintah dan keluarannya tidak diarahkan seperti ini

java -jar MyApp.jar > MyApp.log

Kasus lain seperti itu tercakup dalam jawaban SimonJ, meskipun dia melewatkan poin bahwa tidak ada Console.writeline.

Nithesh Chandra
sumber
Yup - Saya pikir kompiler ziggy (atau Javadocs) bisa melakukan pekerjaan itu untuk saya :)
SimonJ