2010-10-24 47 views
17

Chương trình dưới đây in từng ký tự được viết trên chuẩn, nhưng chỉ sau khi dòng mới được viết (ít nhất là trên hệ thống của tôi!).Tại sao chúng ta không thể đọc một ký tự cùng một lúc từ System.in?

public class Test { 
    public static void main(String[] args) throws java.io.IOException { 
     int c; 
     while ((c = System.in.read()) != -1) 
      System.out.print((char) c); 
    } 
} 

Điều này ngăn mọi người viết nội dung như "Nhấn phím bất kỳ để tiếp tục" và buộc thứ gì đó như "Nhấn enter để tiếp tục".

  • Lý do cơ bản cho việc này là gì?
  • Đây có phải là hạn chế của Java không?
  • Hành vi này có phụ thuộc vào hệ thống (tôi đang sử dụng Ubuntu) không? Làm thế nào nó hoạt động trên máy Mac? Các cửa sổ?
  • Có phụ thuộc vào thiết bị đầu cuối cụ thể mà tôi chạy ứng dụng không? (Đối với tôi nó hoạt động như thế này trong Eclipse và trong gnome-terminal)
  • Có cách giải quyết khác không?
+0

xem câu trả lời của tôi trong http://stackoverflow.com/questions/1864076/equivalent-function-to-cs-getch-in-java/10118990#10118990 –

Trả lời

19

Lý do cơ bản cho điều này là gì?

Hầu hết các thiết bị đầu cuối là dòng đệm theo mặc định, Java không nhận được đầu vào cho đến khi một dòng mới.

Đây có phải là hạn chế của Java không?

Một số thiết bị đầu cuối cổ đại chỉ có thể có đầu vào được đệm theo đường kẻ; mặc dù nó có thể vô hiệu hóa đệm trong hầu hết các thiết bị đầu cuối hiện đại.

Hành vi này phụ thuộc vào hệ thống (tôi có trên Ubuntu) không? Làm thế nào nó hoạt động trên máy Mac? Các cửa sổ?

Có.

Có phụ thuộc vào thiết bị đầu cuối cụ thể mà tôi chạy ứng dụng không? (Đối với tôi, nó hoạt động như thế này trong Eclipse và trong gnome-terminal)

Có.

Có cách giải quyết khác không?

Có các lỗ hổng nền tảng cụ thể. curse trong nền tảng Linux và Unix, và getch() trong Windows. Tôi không biết về bất kỳ cách thức đa nền tảng nào.

liên quan: Tại sao "Nhấn phím bất kỳ để tiếp tục" là ý tưởng tồi:

alt text

0

xem câu trả lời của tôi trong Equivalent function to C's "_getch()" in Java?


public static void getCh() {

final JFrame frame = new JFrame(); synchronized (frame) { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); frame.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { synchronized (frame) { frame.setVisible(false); frame.dispose(); frame.notify(); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } }); frame.setVisible(true); try { frame.wait(); } catch (InterruptedException e1) { } }

}

+4

Điều này không đọc từ 'System.in' * tại tất cả * mặc dù. – aioobe

6

tôi 'm trên Ubuntu

Có cách giải quyết khác không?

Runtime.getRuntime().exec("stty -icanon min 1").waitFor(); 

Và sau đó tất cả các đọc của System.in trong quá trình tương tự sẽ đọc 1 ký tự không chờ đợi EOL.

+0

Điều này dường như không hoạt động trừ khi bạn sử dụng như sau: 'exec (new String [] {"/bin/sh "," - c "," stty -icanon min 1 Kelvin

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