2011-01-10 24 views
141

Tôi đang cố gắng sử dụng lớp Console để nhận dữ liệu nhập từ người dùng nhưng đối tượng rỗng được trả về khi tôi gọi System.console(). Tôi có phải thay đổi bất cứ điều gì trước khi sử dụng System.console không?Java: Cách nhận dữ liệu nhập từ System.console()

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

là thiết bị này dành cho Android? (Tôi đoán từ id người dùng của bạn) –

+5

Hãy xem dự án của McDowell "AbstractingTheJavaConsole": http://illegalargumentexception.googlecode.com/svn/trunk/code/java/AbstractingTheJavaConsole/ – athspk

+5

@RyanFernandes Tên của anh ấy có liên quan đến câu hỏi của anh ấy? –

Trả lời

15

Nó sẽ phụ thuộc vào môi trường của bạn. Ví dụ: nếu bạn đang chạy giao diện người dùng Swing qua số javaw thì có không phải là bảng điều khiển để hiển thị. Nếu bạn đang chạy trong một IDE, nó sẽ phụ thuộc rất nhiều vào việc xử lý giao diện điều khiển của IO cụ thể.

Từ dòng lệnh, nó sẽ là tốt mặc dù. Mẫu:

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

Run này chỉ với java:

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

Một lựa chọn khác là sử dụng System.in, mà bạn có thể muốn quấn trong một BufferedReader để đọc các dòng, hoặc sử dụng Scanner (một lần nữa gói System.in) .

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

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

Tuy nhiên 'nextLine()' là rất lộn xộn để làm việc với. Tốt nhất là nó sẽ cho bạn một nhức đầu khi cố gắng để có được toàn bộ dòng từ giao diện điều khiển. – Yokhen

+7

@Yokhen bạn có thể vui lòng đưa ra một ví dụ trong đó 'in.nextLine()' sẽ tạo ra vấn đề? – ajay

+1

(1) Theo mặc định dấu phân cách của Máy quét là không gian, vì vậy khi người dùng nhập nhiều văn bản, nó sẽ khiến phần mềm tiến hành tiếp theo() và logic trong phần mềm của chúng tôi sẽ sai. (2) Nếu tôi sử dụng nextLine() để đọc toàn bộ câu đầy đủ bao gồm cả không gian và \ n \ r, tôi cần phải cắt() đầu vào của người dùng. (3) next() sẽ đợi người dùng nhập nhưng nextLine() sẽ không. (4) Tôi đã thử nghiệm useDelimiter ("\\ r \\ n"), nhưng nó gây ra() logic tiếp theo trong phần mềm của chúng tôi ở một nơi khác là sai một lần nữa. Kết luận, nó thực sự là khá lộn xộn để sử dụng Scanner để đọc đầu vào của người dùng. BufferedReader là tốt nhất. – oraclesoon

216

Sử dụng Console để đọc đầu vào (có thể sử dụng duy nhất bên ngoài IDE):

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

Một cách khác (chỉ hoạt động ở khắp mọi nơi):

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() trả về null trong một IDE
vì vậy nếu bạn thực sự cần sử dụng System.console(), hãy đọc số solution from McDowell này.

+0

lý do tại sao chúng ta cần BufferedReader đọc đầu vào tại sao chúng ta không thể đọc trực tiếp từ InputStreamReader – Learner

+2

Có câu trả lời: Với BufferedInputStream, phương thức ủy quyền cho phương thức read() đã quá tải đọc 8192 byte và đệm chúng cho đến khi chúng cần thiết. Nó vẫn chỉ trả về một byte duy nhất (nhưng giữ các byte khác trong vùng dự trữ). Bằng cách này, BufferedInputStream thực hiện các cuộc gọi ít hơn đến hệ điều hành để đọc từ tệp. Cảm ơn – Learner

+0

Trong trường hợp chúng tôi muốn đọc mật khẩu từ người dùng, hãy http://stackoverflow.com/questions/22545603/how-to-display-asterisk-for-input-in-java/22546432#22546432 che dấu dòng bằng dấu hoa thị. – oraclesoon

7

Tìm thấy một số câu trả lời tốt ở đây liên quan đến việc đọc từ giao diện điều khiển, ở đây một cách khác sử dụng 'Scanner' để đọc từ giao diện điều khiển:

import java.util.Scanner; 
String data; 

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

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

Bạn có thể không muốn gọi 'close()' máy quét trong trường hợp này, vì nó sẽ đóng System.in và ngăn ứng dụng của bạn đọc nó sau này. (Đọc sau này ném lỗi "không tìm thấy dòng") – Trevor

+0

Có, tôi đồng ý rằng, close() không nên được sử dụng nếu ý định là sử dụng Hệ thống. – vas

29

Có vài cách để đọc chuỗi đầu vào từ bạn giao diện điều khiển/bàn phím. Mã mẫu sau đây cho thấy cách đọc một chuỗi từ bàn điều khiển/bàn phím bằng cách sử dụng 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); 

} 
} 

Phần cuối cùng của mã được sử dụng java.io.Console. bạn không thể có được phiên bản Console từ System.console() khi chạy mã trình diễn thông qua Eclipse. Bởi vì nhật thực chạy ứng dụng của bạn như là một quá trình nền và không phải là một quy trình cấp cao nhất với một bảng điều khiển hệ thống.

3

Sau đây cần athspk's answer và biến thành vòng lặp liên tục cho đến khi người dùng nhập "thoát". Tôi cũng đã viết một số followup answer nơi tôi đã lấy mã này và làm cho nó có thể kiểm chứng được.

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

Ví dụ đầu ra:

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

Hãy thử điều này. hy vọng điều này sẽ giúp ích.

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(); 
2

tôi viết Text-IO thư viện, có thể đối phó với các vấn đề của System.Console() là null khi chạy một ứng dụng từ bên trong một IDE.

Nó giới thiệu một lớp trừu tượng tương tự như được đề xuất bởi McDowell. Nếu System.console() trả về null, thư viện chuyển sang bàn điều khiển dựa trên Swing.

Bên cạnh đó, Text-IO có một loạt các tính năng hữu ích:

  • hỗ trợ giá trị đọc với các loại dữ liệu khác nhau.
  • cho phép che dấu đầu vào khi đọc dữ liệu nhạy cảm.
  • cho phép chọn giá trị từ danh sách.
  • cho phép chỉ định các ràng buộc về giá trị đầu vào (mẫu định dạng, phạm vi giá trị, giới hạn độ dài, v.v.).

Cách sử dụng Ví dụ:

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 + "."); 

Trong this image bạn sẽ nhìn thấy mã trên chạy trong một giao diện điều khiển Swing-based.

Các vấn đề liên quan