我有一个命令,它在命令提示符下直接运行时成功执行,但是当使用runtime.getruntime.exec(“命令”)通过java代码运行同一命令时,它不会给出所需的输出。为什么它不能正常运行??
我正在执行的命令是更改管理密码和要重定向到文件中的命令输出。该命令如下:
Process p=Runtime.getRuntime().exec("net用户管理员1234 > yjs.txt 2>&1");
如果我在命令提示符中直接运行"net用户管理员1234 > yjs.txt 2>&1“,它将正确执行,即创建文本文件yjs.txt并将其重定向到文件中。
但是,当我通过java代码执行相同的命令时,文件yjs.txt根本没有创建。它在编译时甚至不会给出错误消息。知道为什么吗??
发布于 2015-03-25 08:32:45
您的命令提示符所做的不仅仅是运行可执行文件,这正是Runtime.exec()所做的。例如,输出重定向(> yjs.txt 2>&1)是命令提示符的一个特性,而不是Java的一个特性。
如果要将输出重定向到文件,则有两个选项:
Process返回的exec()对象,并将从该对象接收到的输出流和错误流自己写入文件。实际上,你还是应该做第二个案子。如果启动的命令生成大量输出,则如果代码没有使用该输出,则可能会阻塞该输出。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它详细解释了Runtime.exec()可能存在的缺陷,并提供了如何处理它的解决方案(例如,使用本文清单4.5中的StreamGobbler )。
发布于 2015-03-25 08:44:38
这是因为Runtime.getRuntime.exec()命令创建的默认子进程没有自己的终端或控制台。它的所有标准I/O (即stdin、stdout、stderr)都将重定向到父进程,并且可以通过getInputStream/getOutputStream/getErrorStream.访问它们。您可以尝试通过p.getOutputStream读取"net用户管理员1234“命令的输出,并使用文件I/O将其显式写入yjs.txt文件。
另外,ProcessBuilder是执行命令的首选方式,除非您使用的是古老的JVM。有关示例和文档,请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html
https://stackoverflow.com/questions/29250547
复制相似问题