2009-07-29 48 views
4

我在Java中编写了一个命令行应用程序,并希望为此使用新的类java.io.Console。我使用System.console()来获得这个类的一个实例。这个调用返回一个工作控制台,如果我通过'java -jar MyApp.jar'调用我的应用程序,但是如果我通过ant的java任务执行应用程序,则不会设置。叉是真实的,spwan虚假的这个电话。为什么这种差异(System.out.print()在ant下工作正常)?如果我通过ant启动我的应用程序,我怎样才能使用控制台?为什么System.console()在使用java执行时设置,如果通过ant执行则设置为unset?

+2

我注意到在Emacs中启动这种程序时遇到同样的问题。 – 2009-07-29 12:52:19

回答

7

this method状态的Javadoc:

返回与当前Java虚拟机相关联的唯一Console对象(如果有)。

而对于System.Console类状态下的文档:

无论是虚拟机具有控制台取决于底层平台,也取决于在其中虚拟机被调用的方式。如果虚拟机从交互式命令行启动而不重定向标准输入和输出流,则其控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如通过后台作业调度程序,那么它通常没有控制台。

我会想象,当Ant派生一个新的Java进程时,它会重定向标准输出。

+0

那么在哪种情况下`System.Console`实际上是有用的?我不能指望用户永远不会重定向流。 – 2009-07-29 12:56:49

2

如果输入或输出被重定向,System.console()返回 null。蚂蚁就是这么做的。

1

那么,蚂蚁是一个构建自动化工具。通常,交互式应用程序在构建自动化中几乎没有任何地方,所以当通过ant运行任务时,您不会得到控制台。

0

它看起来像蚂蚁Java任务是使用javaw.exe而不是java.exe。 javaw没有连接到它的控制台。

相关问题