如果輸入是交互式的,即來自控制檯,我想打印一個命令提示符,例如「>」有沒有辦法確定Java System.in是否是「交互式」?
但是,如果它被重定向,例如從一個文件,然後我不想提示。
System.in是一個抽象的InputStream,它似乎沒有任何方法。
也許你可以使用instanceof如果具體類型不同?
同樣,如果System.out的被重定向到一個文件我也不想提示
如果輸入是交互式的,即來自控制檯,我想打印一個命令提示符,例如「>」有沒有辦法確定Java System.in是否是「交互式」?
但是,如果它被重定向,例如從一個文件,然後我不想提示。
System.in是一個抽象的InputStream,它似乎沒有任何方法。
也許你可以使用instanceof如果具體類型不同?
同樣,如果System.out的被重定向到一個文件我也不想提示
據我所知,是沒有辦法用純Java要做到這一點,甚至做的JNI/JNA會複雜。
另一種方法可能是使用JDK 1.6中引入的新Console API。這使您可以嘗試獲取控制檯的讀寫器。如果成功了,那麼結果是保證互動......就你的意思而言。
第二種方法是檢查包裝腳本中用於啓動應用程序的腳步,並通過系統屬性將信息傳遞給Java。例如,在GNU/Linux系統上,tty(1)
命令可用於判斷stdin是否連接到「tty」設備。
這應該工作。聽起來像System.console()將返回null,如果沒有連接控制檯。 http://java.sun.com/javase/6/docs/api/java/io/Console.html – 2010-03-10 00:22:34
控制檯API在某種意義上起作用,但是如果用戶想從應用程序的輸入(比如說)文件,然後打開一個新的控制檯流顛覆。 IMO,控制檯API只能在應用程序從非交互式標準輸入讀取沒有意義(或危險)時使用。 – 2010-03-10 00:44:41
我沒想過打開一個新的控制檯流。我只是想,你可以檢查從System.console()非空返回,以確定您是否連接到控制檯。 – 2010-03-11 14:18:35
你可以把它互動:
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();
}
}
}
對不起,我不明白這個答案。它似乎被張貼兩次? – 2010-03-11 14:19:37
我真的不認爲這回答了被問到的問題。 OP想要判斷代碼是否交互調用(標準輸入/標準輸出連接到控制檯)。 – 2014-06-18 13:40:27
對於使用JNI特定的Linux解決方案,請參閱[這裏](http://stackoverflow.com/a/18371202/446591)。你只需要將'fileno(stderr)'改爲'fileno(stdin)'。 – 2013-08-22 03:29:23
可能重複[如何檢查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