Apa sebenarnya perbedaan teknis antara konsol.writeline
dan Sistem.keluar.println
?
Saya tahu bahwa Sistem.keluar.println
menulis ke output standar tapi ini bukan hal yang sama seperti konsol?
Saya tidak sepenuhnya memahami dokumentasi untuk konsol.writeline
.
Berikut ini adalah perbedaan utama antara menggunakan Sistem.keluar
/.err
/.di
dan Sistem.konsol()
:
Sistem.konsol()
mengembalikan null jika aplikasi ini tidak berjalan pada terminal (meskipun anda dapat menangani hal ini dalam aplikasi anda)Sistem.konsol()
menyediakan metode untuk membaca password tanpa bergema karakterSistem.keluar
dan Sistem.err
menggunakan platform default encoding, sedangkan Konsol
kelas metode output yang menggunakan konsol encodingYang terakhir ini perilaku mungkin tidak segera jelas, tapi kode seperti ini dapat menunjukkan perbedaan:
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);
}
}
}
Pada Windows XP yang memiliki sistem pengkodean windows-1252 dan default console pengkodean IBM850, kode ini akan menulis:
???????
?Hello?
???????
┌─────┐
│Hello│
└─────┘
Perhatikan bahwa perilaku ini tergantung pada konsol pengkodean yang ditetapkan untuk encoding yang berbeda untuk sistem pengkodean. Ini adalah perilaku default pada Windows untuk banyak alasan historis.
Mereka're pada dasarnya sama, jika program anda yang dijalankan dari prompt interaktif dan anda belum't diarahkan stdin atau stdout:
public class ConsoleTest {
public static void main(String[] args) {
System.out.println("Console is: " + System.console());
}
}
hasil:
$ java ConsoleTest
Console is: java.io.Console@2747ee05
$ java ConsoleTest </dev/null
Console is: null
$ java ConsoleTest | cat
Console is: null
Alasan Konsol
yang ada adalah untuk menyediakan fitur yang berguna dalam kasus tertentu yang anda're dijalankan dari command line:
Konsol
akan antrian mereka dengan baik, sedangkan jika anda menggunakan Sistem.in/out maka semua petunjuk akan muncul secara bersamaan).Perilaku di atas yang mengarahkan bahkan satu aliran hasil dalam Sistem.konsol()
kembali null
; lain iritasi yang ada's sering tidak Konsol
objek yang tersedia saat melahirkan dari program lain seperti Eclipse atau Maven.
Pertama aku takut pertanyaan anda mengandung sedikit kesalahan. Tidak ada metode writeline di kelas Konsol. Bukan kelas Konsol menyediakan metode penulis() yang mengembalikan PrintWriter. Cetak ini penulis telah println().
Sekarang apa perbedaan antara
System.console().writer().println("hello from console");
dan
System.out.println("hello system out");
Jika anda menjalankan aplikasi anda dari baris perintah saya pikir tidak ada perbedaan. Tapi jika konsol ini tidak tersedia di Sistem.konsol() mengembalikan null sementara Sistem.di luar itu masih ada. Hal ini mungkin terjadi jika anda menjalankan aplikasi anda dan melakukan redirect STDOUT ke file.
Berikut ini adalah contoh saya baru saja dilaksanakan.
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 aku berlari aplikasi dari command prompt yang saya punya sebagai berikut:
$ java TestConsole
console=java.io.Console@93dcd
hello from console
tapi ketika saya diarahkan STDOUT ke file...
$ java TestConsole >/tmp/test
Exception in thread "main" java.lang.NullPointerException
at TestConsole.main(TestConsole.java:8)
Baris 8 adalah konsol.penulis().println()
.
Berikut ini adalah isi dari /tmp/test
console=null
Saya harap penjelasan saya membantu.
Ada's ada Console.writeline
di Jawa. Yang dalam .NET.
Konsol dan standar tidak sama. Jika anda baca Javadoc halaman anda sebutkan, anda akan melihat bahwa aplikasi dapat memiliki akses ke konsol hanya jika itu dipanggil dari command line dan output tidak diarahkan seperti ini
java -jar MyApp.jar > MyApp.log
Lainnya seperti kasus-kasus yang tercakup dalam SimonJ's jawaban, meskipun ia tidak terjawab di point yang ada's ada Console.writeline
.