Java: Cara mendapatkan input dari System.console ()


163

Saya mencoba menggunakan kelas Konsol untuk mendapatkan input dari pengguna tetapi objek nol dikembalikan ketika saya menelepon System.console(). Apakah saya harus mengubah apa pun sebelum menggunakan System.console?

Console co=System.console();
System.out.println(co);
try{
    String s=co.readLine();
}

1
apakah ini untuk android? (Saya menebak dari id pengguna Anda)
Ryan Fernandes

Apakah Anda menggunakan gerhana untuk memulai program Anda? Cobalah untuk memulai program Anda tanpa gerhana menggunakan java.exe.
keuleJ

5
Silahkan lihat pada proyek McDowell "AbstractingTheJavaConsole": illegalargumentexception.googlecode.com/svn/trunk/code/java/...
athspk

7
@RyanFernandes Bagaimana namanya relevan dengan pertanyaannya?
b1nary.atr0phy

Jawaban:


239

Menggunakan Konsol untuk membaca input (hanya dapat digunakan di luar IDE):

System.out.print("Enter something:");
String input = System.console().readLine();

Cara lain (bekerja di mana-mana):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter String");
        String s = br.readLine();
        System.out.print("Enter Integer:");
        try {
            int i = Integer.parseInt(br.readLine());
        } catch(NumberFormatException nfe) {
            System.err.println("Invalid Format!");
        }
    }
}

System.console () mengembalikan null dalam IDE.
Jadi, jika Anda benar-benar perlu menggunakan System.console(), baca solusi ini dari McDowell .


mengapa kita perlu BufferedReader untuk membaca input mengapa kita tidak bisa langsung membaca dari InputStreamReader
Learner

2
Mendapat jawabannya: Dengan BufferedInputStream, metode ini mendelegasikan ke metode read () yang kelebihan beban yang membaca jumlah byte 8192 dan men-buffer mereka sampai dibutuhkan. Itu masih mengembalikan hanya satu byte (tetapi membuat yang lain dalam cadangan). Dengan cara ini BufferedInputStream membuat lebih sedikit panggilan asli ke OS untuk membaca dari file. Terima kasih
Pelajar

Jika kami ingin membaca kata sandi dari pengguna, stackoverflow.com/questions/22545603/... menutupi garis dengan asterisk.
oraclesoon

@Pelajar alasan lain mungkin karena BufferedReader menyediakan metode readLine()yang tidak ada untuknya InputStreamReader.
Marcono1234

116
Scanner in = new Scanner(System.in);

int i = in.nextInt();
String s = in.next();

4
Namun nextLine()sangat berantakan untuk dikerjakan. Paling-paling itu akan membuat Anda sakit kepala ketika mencoba untuk mendapatkan seluruh baris dari konsol.
Yokhen

9
@Yokhen, bisakah Anda memberi contoh di mana in.nextLine()akan membuat masalah?
ajay

2
(1) Secara default pembatas Scanner adalah ruang, jadi ketika pengguna memasukkan beberapa teks, itu akan menyebabkan perangkat lunak untuk melanjutkan ke beberapa berikutnya berikutnya () dan logika dalam perangkat lunak kami akan salah. (2) Jika saya menggunakan nextLine () untuk membaca seluruh kalimat lengkap yang termasuk spasi dan \ n \ r, saya perlu memotong () input pengguna. (3) next () akan menunggu input pengguna tetapi nextLine () tidak akan. (4) Saya menguji useDelimiter ("\\ r \\ n"), tetapi itu menyebabkan logika () berikutnya dalam perangkat lunak kami di tempat lain menjadi salah lagi. Kesimpulannya, memang cukup berantakan untuk menggunakan Scanner untuk membaca input pengguna. BufferedReader adalah yang terbaik.
oraclesoon

Saya juga memiliki masalah dengan pemindai, terutama java.util.NoSuchElementExceptionyang saya tidak mengerti.
Romain Vincent

Semua ini harus ada di dalam coba-dengan-sumber daya dan metode harus di.nextLine () jika Anda ingin membaca baris.
Calabacin

35

Ada beberapa cara untuk membaca string input dari konsol / keyboard Anda. Kode contoh berikut menunjukkan cara membaca string dari konsol / keyboard dengan menggunakan Java.

public class ConsoleReadingDemo {

public static void main(String[] args) {

    // ====
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Please enter user name : ");
    String username = null;
    try {
        username = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("You entered : " + username);

    // ===== In Java 5, Java.util,Scanner is used for this purpose.
    Scanner in = new Scanner(System.in);
    System.out.print("Please enter user name : ");
    username = in.nextLine();      
    System.out.println("You entered : " + username);


    // ====== Java 6
    Console console = System.console();
    username = console.readLine("Please enter user name : ");   
    System.out.println("You entered : " + username);

}
}

Bagian terakhir dari kode yang digunakan java.io.Consolekelas. Anda tidak bisa mendapatkan instance Konsol dari System.console()saat menjalankan kode demo melalui Eclipse. Karena gerhana menjalankan aplikasi Anda sebagai proses latar belakang dan bukan sebagai proses tingkat atas dengan konsol sistem.


18

Itu akan tergantung pada lingkungan Anda. Jika Anda menjalankan UI Swing via javawmisalnya, maka tidak ada konsol untuk ditampilkan. Jika Anda menjalankan dalam IDE, itu akan sangat tergantung pada penanganan IDE khusus konsol IO.

Dari baris perintah, itu seharusnya baik-baik saja. Sampel:

import java.io.Console;

public class Test {

    public static void main(String[] args) throws Exception {
        Console console = System.console();
        if (console == null) {
            System.out.println("Unable to fetch console");
            return;
        }
        String line = console.readLine();
        console.printf("I saw this line: %s", line);
    }
}

Jalankan ini hanya dengan java:

> javac Test.java
> java Test
Foo  <---- entered by the user
I saw this line: Foo    <---- program output

Pilihan lain adalah menggunakan System.in, yang Anda mungkin ingin membungkusnya BufferedReaderdengan membaca baris, atau menggunakan Scanner(lagi membungkus System.in).


7

Menemukan beberapa jawaban yang bagus di sini mengenai membaca dari konsol, di sini cara lain menggunakan 'Scanner' untuk membaca dari konsol:

import java.util.Scanner;
String data;

Scanner scanInput = new Scanner(System.in);
data= scanInput.nextLine();

scanInput.close();            
System.out.println(data);

1
Anda mungkin tidak ingin memanggil close()pemindai dalam kasus ini, karena ini akan menutup System.in dan mencegah aplikasi Anda membacanya di kemudian hari. (Membaca nanti menimbulkan kesalahan "tidak ada garis yang ditemukan")
Trevor

Ya, saya setuju untuk itu, tutup () tidak boleh digunakan jika tujuannya adalah untuk menggunakan System.in nanti dalam program.
akhouri

5

Coba ini. Semoga ini bisa membantu.

    String cls0;
    String cls1;

    Scanner in = new Scanner(System.in);  
    System.out.println("Enter a string");  
    cls0 = in.nextLine();  

    System.out.println("Enter a string");  
    cls1 = in.nextLine(); 

3

Berikut ini mengambil jawaban athspk dan membuatnya menjadi jawaban yang terus menerus sampai pengguna mengetik "keluar". Saya juga menulis jawaban tindak lanjut di mana saya mengambil kode ini dan membuatnya dapat diuji.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class LoopingConsoleInputExample {

   public static final String EXIT_COMMAND = "exit";

   public static void main(final String[] args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("Enter some text, or '" + EXIT_COMMAND + "' to quit");

      while (true) {

         System.out.print("> ");
         String input = br.readLine();
         System.out.println(input);

         if (input.length() == EXIT_COMMAND.length() && input.toLowerCase().equals(EXIT_COMMAND)) {
            System.out.println("Exiting.");
            return;
         }

         System.out.println("...response goes here...");
      }
   }
}

Contoh output:

Enter some text, or 'exit' to quit
> one
one
...response goes here...
> two
two
...response goes here...
> three
three
...response goes here...
> exit
exit
Exiting.

3

Saya menulis pustaka Text-IO , yang dapat menangani masalah System.console () menjadi nol saat menjalankan aplikasi dari dalam IDE.

Ini memperkenalkan lapisan abstraksi yang mirip dengan yang diusulkan oleh McDowell . Jika System.console () mengembalikan null, perpustakaan beralih ke konsol berbasis Swing.

Selain itu, Text-IO memiliki serangkaian fitur yang berguna:

  • mendukung nilai membaca dengan berbagai tipe data.
  • memungkinkan menyembunyikan input saat membaca data sensitif.
  • memungkinkan memilih nilai dari daftar.
  • memungkinkan menentukan batasan pada nilai input (pola format, rentang nilai, batasan panjang dll).

Contoh penggunaan:

TextIO textIO = TextIoFactory.getTextIO();

String user = textIO.newStringInputReader()
        .withDefaultValue("admin")
        .read("Username");

String password = textIO.newStringInputReader()
        .withMinLength(6)
        .withInputMasking(true)
        .read("Password");

int age = textIO.newIntInputReader()
        .withMinVal(13)
        .read("Age");

Month month = textIO.newEnumInputReader(Month.class)
        .read("What month were you born in?");

textIO.getTextTerminal().println("User " + user + " is " + age + " years old, " +
        "was born in " + month + " and has the password " + password + ".");

Pada gambar ini Anda dapat melihat kode di atas berjalan di konsol berbasis Swing.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.