2010-03-10 108 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

相关问题