Java: Cách nhận đầu vào từ System.console ()


163

Tôi đang cố gắng sử dụng lớp Console để nhận đầu vào từ người dùng nhưng một đối tượng null đượ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?

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

1
cái này có dùng cho Android không? (tôi đoán từ id người dùng của bạn)
Ryan Fernandes

Bạn đang sử dụng nhật thực để bắt đầu chương trình của bạn? Cố gắng bắt đầu chương trình của bạn mà không có nhật thực bằng java.exe.
keuleJ

5
Hãy xem dự án "Trừu tượng hóa" của McDowell: ilargargumentexception.googlecode.com/svn/trunk/code/java/iêu
athspk

7
@RyanFernandes Tên của anh ấy liên quan đến câu hỏi của anh ấy như thế nào?
b1nary.atr0phy

Câu trả lời:


239

Sử dụng Bảng điều khiển để đọc đầu vào (chỉ có thể sử dụng bên ngoài IDE):

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

Một cách khác (hoạt động ở 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 IDE.
Vì vậy, nếu bạn thực sự cần sử dụng System.console(), hãy đọc giải pháp này từ McDowell .


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
Người học

2
Có câu trả lời: Với BufferedInputStream, phương thức ủy quyền cho phương thức read () bị quá tải, đọc 8192 lượng byte và đệm chúng cho đến khi cần. Nó vẫn chỉ trả về byte đơn (nhưng giữ cho các byte khác dự trữ). Bằng cách này, BufferedInputStream thực hiện các cuộc gọi gốc đến HĐH để đọc từ tệp. Cảm ơn
Người học

Trong trường hợp chúng tôi muốn đọc mật khẩu từ người dùng, stackoverflow.com/questions/22545603/ khuyên che dấu dòng bằng dấu hoa thị.
orialsoon

@Learner một lý do khác có thể là BufferedReader cung cấp phương thức readLine()không tồn tại InputStreamReader.
Marcono1234

116
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 nó sẽ khiến bạn đau đầu khi cố gắng lấy toàn bộ dòng từ bảng điều khiển.
Yokhen

9
@Yokhen bạn có thể vui lòng cho một ví dụ nơi in.nextLine()sẽ tạo ra vấn đề?
ajay

2
(1) Theo mặc định, dấu phân cách của Máy quét là khoảng trắng, do đó, khi người dùng nhập nhiều văn bản, điều đó sẽ khiến phần mềm tiếp tục chuyển sang lần 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 bao gồm khoảng trắng và \ n \ r, tôi cần phải cắt () đầu vào của người dùng. (3) next () sẽ đợi đầu vào của người dùng nhưng nextLine () sẽ không. (4) Tôi đã kiểm tra useD006iter ("\\ r \\ n"), nhưng nó khiến logic () tiếp theo trong phần mềm của chúng tôi ở một nơi khác bị sai lần nữa. Kết luận, thực sự khá lộn xộn khi sử dụng Scanner để đọc dữ liệu nhập của người dùng. BufferedReader là tốt nhất.
orialsoon 17/03/2017

Tôi cũng gặp vấn đề với máy quét, đáng chú ý là tôi nhận được một java.util.NoSuchElementExceptionđiều mà tôi không hiểu lắm.
Romain Vincent

Tất cả điều này nên nằm trong một tài nguyên thử và phương thức nên nằm trong.nextLine () nếu bạn muốn đọc một dòng.
Calabacin

35

Có một số cách để đọc chuỗi đầu vào từ bàn điều khiển / bàn phím của bạn. 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ủa mã được sử dụng java.io.Consolelớp. bạn không thể lấy cá thể Console từ System.console()khi chạy mã trình diễn qua Eclipse. Bởi vì nhật thực chạy ứng dụng của bạn như một quá trình nền chứ không phải là quá trình cấp cao nhất với bảng điều khiển hệ thống.


18

Nó sẽ phụ thuộc vào môi trường của bạn. javawVí dụ: nếu bạn đang chạy UI UI , thì sẽ không có bảng điều khiển để hiển thị. Nếu bạn đang chạy trong IDE, nó sẽ phụ thuộc rất nhiều vào cách xử lý IO của console cụ thể.

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

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

Chạy 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 tùy chọn khác là sử dụng System.in, mà bạn có thể muốn bọc trong một BufferedReaderdòng để đọc hoặc sử dụng Scanner(gói lại System.in).


7

Tìm thấy một số câu trả lời tốt ở đây liên quan đến việc đọc từ bảng điều khiển, ở đây một cách khác sử dụng 'Máy quét' để đọc từ bảng đ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 từ nó sau này. (Đọc sau đó sẽ ném lỗi "không tìm thấy dòng nào")
Trevor

Có, tôi đồng ý với điều đó, không nên sử dụng close () nếu ý định sử dụng System.in sau này trong chương trình.
akhouri

5

Thử cái này. hy vọng điều này sẽ giúp.

    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

Sau đây có câu trả lời của athspk và biến nó thành một vòng lặp liên tục cho đến khi người dùng gõ "thoát". Tôi cũng đã viết một câu trả lời tiếp theo trong đó tôi đã lấy mã này và làm cho nó có thể kiểm tra đượ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

Tôi đã viết Text-IO thư viện , có thể giải quyết vấn đề System.console () là null khi chạy một ứng dụng từ bên trong IDE.

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

Ngoài ra, Text-IO có một loạt các tính năng hữu ích:

  • hỗ trợ đọc các giá trị 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 một giá trị từ danh sách.
  • cho phép chỉ định các ràng buộc trên các giá trị đầu vào (mẫu định dạng, phạm vi giá trị, ràng buộc độ dài, v.v.).

Ví dụ sử dụng:

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 hình ảnh này, bạn có thể thấy đoạn mã trên đang chạy trong bảng điều khiển dựa trên Swing.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.