2015-03-25 61 views
0

我有一个命令在命令提示符下直接运行时成功执行,但当使用runtime.getruntime.exec(“command “);它不会提供所需的输出。为什么它不能正常运行?当使用runtime.getruntime命令运行java代码时,命令执行不成功执行

我正在执行的命令是更改管理密码和我想重定向到文件的命令输出。命令如下:

进程p = Runtime.getRuntime()。exec(“net user administrator 1234> yjs.txt 2> & 1”);

如果我直接运行“净用户管理员1234> yjs.txt 2> & 1”在我的命令提示它正确执行即在创建文本文件yjs.txt和ouptut被重定向到文件..

但是当我通过java代码执行相同的命令时,文件yjs.txt根本就没有创建。它编译时甚至不会给出错误消息。任何想法为什么?

+0

您是否检查了所有权限?虽然,那么你至少应该得到错误信息。也许该文件已创建,但在预期的另一个目录中。 – 2015-03-25 08:28:54

回答

0

您的命令提示符不仅仅是运行可执行文件,这是Runtime.exec()所做的。例如,输出重定向(> yjs.txt 2>&1)是命令提示符的一个功能,但不是Java的一项功能。

如果你想将输出重定向到一个文件,你有两个选择:

  • 把完整的命令,包括输出重定向到一个批处理文件(或shell脚本,根据您的操作系统)并从Java执行该批处理文件。
  • 使用exec()返回的Process对象,并将自己从该对象接收到的输出和错误流写入文件。

其实,你应该做第二种情况。如果您启动的命令生成大量输出,则可能会在您的代码没有使用该输出时开始阻止。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它详细解释了Runtime.exec()的可能缺陷,并提供了解决方法(例如,在文章的列表4.5中使用StreamGobbler)。

+0

@Balaji Katika和大提琴非常感谢..我用大提琴的方法来使用过程对象..和它的工作:) – yjs 2015-03-27 06:15:53

0

这是因为Runtime.getRuntime.exec()命令创建的默认子进程没有自己的终端或控制台。其所有标准I/O(即stdin,stdout,stderr)都将被重定向到父进程,并且可以通过getInputStream/getOutputStream/getErrorStream访问它们。 您可以尝试通过p.getOutputStream读取命令“net user administrator 1234”的输出,并使用文件I/O将其明确写入yjs.txt文件。

此外,ProcessBuilder是执行命令的首选方式,除非您被古老的JVM所困住。请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html的示例和文档