有没有办法确定Java System.in是否是“交互式”?
如果输入是交互式的,即来自控制台,我想打印一个命令提示符,例如“>”有没有办法确定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