2010-03-10 32 views
5

Nếu đầu vào tương tác, tức là từ bảng điều khiển, tôi muốn in dấu nhắc lệnh, ví dụ: ">"Có cách nào để xác định xem Java System.in có "tương tác" không?

Nhưng nếu nó được chuyển hướng, ví dụ: từ một tập tin, sau đó tôi không muốn nhắc.

System.in là một InputStream trừu tượng không có bất kỳ phương pháp nào cho việc này.

Có thể bạn có thể sử dụng instanceof nếu loại bê tông khác?

Đồng thời, nếu System.out được chuyển hướng đến một tập tin tôi cũng không muốn nhắc

+0

Đối với một giải pháp Linux cụ thể sử dụng JNI, xem [ở đây] (http://stackoverflow.com/a/18371202/446591). Bạn chỉ cần thay đổi 'fileno (stderr)' thành 'fileno (stdin)'. –

+0

bản sao có thể có của [Làm cách nào tôi có thể kiểm tra xem luồng đầu vào/đầu ra của chương trình Java có được kết nối với thiết bị đầu cuối không?] (Http://stackoverflow.com/questions/1403772/how-can-i-check-if-a-java -Chương trình-đầu vào-đầu ra-suối-được-kết nối-to-a-hạn) –

Trả lời

4

AFAIK, không có cách nào để làm điều này trong tinh khiết Java, và thậm chí làm nó trong JNI/JNA sẽ phức tạp.

Một giải pháp thay thế có thể là sử dụng API giao diện điều khiển mới được giới thiệu trong JDK 1.6. Điều này cho phép bạn cố gắng để có được một người đọc/nhà văn cho giao diện điều khiển. Nếu thành công, kết quả sẽ được đảm bảo tương tác ... theo ý bạn.

Một lựa chọn thứ hai là kiểm tra tác vụ chân thực trong tập lệnh trình bao bọc mà bạn sử dụng để khởi chạy ứng dụng của mình và chuyển thông tin đến Java thông qua các thuộc tính hệ thống. Ví dụ, trên hệ thống GNU/Linux, lệnh tty(1) có thể được sử dụng để biết liệu stdin có được kết nối với thiết bị "tty" hay không.

+1

Điều đó sẽ làm việc. Có vẻ như System.console() sẽ trả về null nếu không có console nào được đính kèm. http://java.sun.com/javase/6/docs/api/java/io/Console.html –

+1

API điều khiển hoạt động theo một nghĩa nào đó, nhưng nếu người dùng muốn đầu vào của ứng dụng từ (nói) a tệp, sau đó mở luồng điều khiển luồng mới. IMO, API giao diện điều khiển chỉ nên được sử dụng khi nó không có ý nghĩa (hoặc là nguy hiểm) cho ứng dụng đọc từ một stdin không tương tác. –

+0

Tôi không nghĩ đến việc mở luồng trình điều khiển mới. Tôi đã chỉ nghĩ rằng bạn có thể kiểm tra một trở về không null từ System.console() để xác định xem bạn đã được gắn vào một giao diện điều khiển. –

-2

Bạn có thể làm cho nó tương tác:

public static void main(String args[]) throws Exception { 
    String action = null; 
    Scanner in = new Scanner(System.in); 

    while (!((action = in.nextLine()).equalsIgnoreCase("exit"))) { 
     if (action.equalsIgnoreCase("open")) { 
      openConnections(); 
     } else if (action.equalsIgnoreCase("close")) { 
      closeConnections(); 
     } 
    } 
} 
+0

Xin lỗi, tôi không hiểu câu trả lời này. Và nó dường như được đăng hai lần? –

+0

Tôi thực sự không nghĩ rằng điều này trả lời câu hỏi đã được hỏi. OP muốn biết mã có được gọi là tương tác hay không (với stdin/stdout đính kèm với một giao diện điều khiển). –

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