2010-03-10 82 views
5

如果輸入是交互式的,即來自控制檯,我想打印一個命令提示符,例如「>」有沒有辦法確定Java System.in是否是「交互式」?

但是,如果它被重定向,例如從一個文件,然後我不想提示。

System.in是一個抽象的InputStream,它似乎沒有任何方法。

也許你可以使用instanceof如果具體類型不同?

同樣,如果System.out的被重定向到一個文件我也不想提示

+0

對於使用JNI特定的Linux解決方案,請參閱[這裏](http://stackoverflow.com/a/18371202/446591)。你只需要將'fileno(stderr)'改爲'fileno(stdin)'。 – 2013-08-22 03:29:23

+0

可能重複[如何檢查Java程序的輸入/輸出流是否連接到終端?](http://stackoverflow.com/questions/1403772/how-can-i-check-if-a-java -programs-input-output-streams-is-connected-a-term) – 2014-05-02 01:49:14

回答

4

據我所知,是沒有辦法用純Java要做到這一點,甚至做的JNI/JNA會複雜。

另一種方法可能是使用JDK 1.6中引入的新Console API。這使您可以嘗試獲取控制檯的讀寫器。如果成功了,那麼結果是保證互動......就你的意思而言。

第二種方法是檢查包裝腳本中用於啓動應用程序的腳步,並通過系統屬性將信息傳遞給Java。例如,在GNU/Linux系統上,tty(1)命令可用於判斷stdin是否連接到「tty」設備。

+1

這應該工作。聽起來像System.console()將返回null,如果沒有連接控制檯。 http://java.sun.com/javase/6/docs/api/java/io/Console.html – 2010-03-10 00:22:34

+1

控制檯API在某種意義上起作用,但是如果用戶想從應用程序的輸入(比如說)文件,然後打開一個新的控制檯流顛覆。 IMO,控制檯API只能在應用程序從非交互式標準輸入讀取沒有意義(或危險)時使用。 – 2010-03-10 00:44:41

+0

我沒想過打開一個新的控制檯流。我只是想,你可以檢查從System.console()非空返回,以確定您是否連接到控制檯。 – 2010-03-11 14:18:35

-2

你可以把它互動:

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

對不起,我不明白這個答案。它似乎被張貼兩次? – 2010-03-11 14:19:37

+0

我真的不認爲這回答了被問到的問題。 OP想要判斷代碼是否交互調用(標準輸入/標準輸出連接到控制檯)。 – 2014-06-18 13:40:27

相關問題