使用runtime.getruntime命令在java代码中运行时,命令无法成功执行

时间:2015-03-25 08:18:39

标签: java cmd

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

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

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

如果我在我的命令提示符中直接运行“net user administrator 1234&gt; yjs.txt 2&gt;&amp; 1”,它会正确执行,即创建文本文件yjs.txt并将ouptut重定向到文件中.. < / p>

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

2 个答案:

答案 0 :(得分:0)

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

如果要将输出重定向到文件,则有两个选项:

  • 将包含output-redirects的完整命令放入批处理文件(或shell脚本,具体取决于您的操作系统),并从Java执行该批处理文件。
  • 使用Process返回的exec()对象,并将您从该对象收到的输出和错误流自行写入文件。

实际上,无论如何你应该做第二种情况。如果您启动的命令会产生大量输出,那么如果您的代码没有使用该输出,它可能会开始阻塞。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它详细解释了Runtime.exec()可能存在的陷阱,并提供了解决方法(例如,使用清单4.5中的StreamGobbler文章)。

答案 1 :(得分:0)

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

将其显式写入yjs.txt文件

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