首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用runtime.getruntime命令在java代码中运行时,命令不会成功执行。

使用runtime.getruntime命令在java代码中运行时,命令不会成功执行。
EN

Stack Overflow用户
提问于 2015-03-25 08:18:38
回答 2查看 810关注 0票数 0

我有一个命令,它在命令提示符下直接运行时成功执行,但是当使用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根本没有创建。它在编译时甚至不会给出错误消息。知道为什么吗??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 08:32:45

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

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

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

实际上,你还是应该做第二个案子。如果启动的命令生成大量输出,则如果代码没有使用该输出,则可能会阻塞该输出。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它详细解释了Runtime.exec()可能存在的缺陷,并提供了如何处理它的解决方案(例如,使用本文清单4.5中的StreamGobbler )。

票数 0
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29250547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档