Ada satu pintu input yang keberadaannya sering luput: class java.io.Console. Berbeda dari Scanner yang membaca aliran System.in secara umum, Console terikat langsung pada terminal interaktif tempat program dijalankan. Ikatan ini memberinya satu kemampuan yang tidak dimiliki Scanner: membaca kata sandi tanpa menampilkan karakternya di layar. Pada Chapter ini kita akan mengenal class Console, memahami kapan method System.console() mengembalikan null, dan menyiapkan rencana cadangan untuk situasi tersebut.
Mengambil Instance Console #
Class Console tidak dapat dibuat dengan new; satu-satunya jalan adalah memanggil System.console(). Method tersebut mengembalikan instance yang terikat pada terminal, atau null bila program tidak berjalan pada terminal interaktif. Program berikut memeriksa kedua kemungkinan tersebut:
public class CekConsole {
public static void main(String[] args) {
java.io.Console konsol = System.console();
if (konsol == null) {
System.out.println("System.console() mengembalikan null.");
System.out.println("stdin bukan terminal interaktif; gunakan Scanner.");
return;
}
String nama = konsol.readLine("Nama Anda: ");
System.out.println("Halo, " + nama + "!");
}
}Output yang Dihasilkan:
System.console() mengembalikan null.
stdin bukan terminal interaktif; gunakan Scanner.Output di atas dihasilkan ketika program dijalankan tanpa terminal interaktif — misalnya ketika keluaran diarahkan ke berkas atau program dijalankan oleh alat otomatis. Mari kita bedah baris-barisnya:
- Baris 3 (
java.io.Console konsol = System.console();): meminta instanceConsoledari sistem. Nama class ditulis memenuhi (fully qualified) karena tidak menggunakanimport— alternatifnyaimport java.io.Console;di bagian atas. - Baris 5-8 (
if (konsol == null) ...): jalur cadangan ketika terminal tidak tersedia. Program tetap memberi tahu apa yang terjadi alih-alih berhenti denganNullPointerException. - Baris 10 (
konsol.readLine("Nama Anda: ")): membaca satu baris masukan dengan prompt yang dicetak lebih dulu — fitur kecil yang membuatConsolenyaman untuk dialog interaktif.
Membaca Kata Sandi #
Keunggulan utama Console adalah method readPassword, yang membaca teks tanpa menggema ke layar — persis perilaku perintah login atau sudo di terminal. Method ini mengembalikan array char[], bukan String; alasannya serius: teks dalam String tinggal di memori sampai garbage collector menjalankan tugasnya, sementara array karakter dapat segera ditimpa nol segera setelah tidak dibutuhkan. Untuk materi keamanan yang lebih lengkap, kita akan membahasnya pada Section Security.
Bentuk pemakaiannya ringkas:
char[] sandi = konsol.readPassword("Kata sandi: ");
// ... periksa sandi, lalu bersihkan:
java.util.Arrays.fill(sandi, '\0');Karena readPassword tidak dapat diuji pada lingkungan tanpa terminal interaktif, cuplikan di atas sengaja ditampilkan sebagai ilustrasi tanpa klaim keluaran. Pola penerapannya pada program nyata: prompt pembacaan, verifikasi, lalu pembersihan array secepat mungkin.
Console atau Scanner #
Pilihan antara keduanya sebaiknya ditentukan oleh sifat program. Gunakan Console ketika program berdialog langsung dengan manusia di terminal dan — terutama — ketika membutuhkan pembacaan kata sandi. Gunakan Scanner ketika masukan bisa datang dari pipa, berkas, atau alat otomatis; kemampuannya memilah token bertipe (nextInt, nextDouble) juga lebih kaya. Program berikut memperlihatkan padanan Scanner untuk dialog yang sama:
import java.util.Scanner;
public class SapaInteraktif {
public static void main(String[] args) {
Scanner masukan = new Scanner(System.in);
System.out.print("Nama Anda: ");
String nama = masukan.nextLine();
System.out.print("Umur Anda: ");
int umur = Integer.parseInt(masukan.nextLine());
System.out.println("Halo, " + nama + "! Umur Anda " + umur + " tahun.");
masukan.close();
}
}Output yang Dihasilkan:
Nama Anda: Umur Anda: Halo, Budi! Umur Anda 25 tahun.Tidak ada prompt otomatis pada Scanner, sehingga baris System.out.print dicetak manual sebelum setiap pembacaan. Berbeda dari Console.readLine yang menerima prompt sebagai argumen, pembacaan dan pencetakan di sini menjadi dua langkah terpisah — harga yang pantas dibayar demi fleksibilitas membaca dari sumber mana pun. Dengan mengenal kedua pintu ini, kita kini siap memasuki Section berikutnya: mengendalikan alur eksekusi program dengan struktur kontrol.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
CekConsole.java
Unduh berkaspublic class CekConsole {
public static void main(String[] args) {
java.io.Console konsol = System.console();
if (konsol == null) {
System.out.println("System.console() mengembalikan null.");
System.out.println("stdin bukan terminal interaktif; gunakan Scanner.");
return;
}
String nama = konsol.readLine("Nama Anda: ");
System.out.println("Halo, " + nama + "!");
}
}
SapaInteraktif.java
Unduh berkasimport java.util.Scanner;
public class SapaInteraktif {
public static void main(String[] args) {
Scanner masukan = new Scanner(System.in);
System.out.print("Nama Anda: ");
String nama = masukan.nextLine();
System.out.print("Umur Anda: ");
int umur = Integer.parseInt(masukan.nextLine());
System.out.println("Halo, " + nama + "! Umur Anda " + umur + " tahun.");
masukan.close();
}
}