【问题标题】:Calling Unix command from Java从 Java 调用 Unix 命令
【发布时间】:2011-10-11 11:06:08
【问题描述】:

如何执行 Unix grep 程序,通过从 Java 程序内部调用该命令来搜索一组文件中的模式?

【问题讨论】:

  • 你试过什么?您是否看过“相关”部分中的问题?你到底有什么问题?
  • 这类问题的频率表明了几个有趣的观点。首先,Java 并没有竭尽全力让调用“外星人”(阅读:非 Java)程序并处理它们的输出变得容易。其次,这是人们最终想要经常做的事情。其他结论是可能的,但值得怀疑,例如 Java 因玩得好和与他人相处得低分,以及提问者是否选择了错误的语言来完成任务。这些是容易得出的结论,但可能具有欺骗性。

标签: java unix grep exec pipe


【解决方案1】:

您可以使用Runtime.exec

public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)
                    throws IOException

在具有指定环境和工作目录的单独进程中执行指定的命令和参数。

编辑:正如 Joachim 和 andypandy 所指出的,ProcessBuilder 具有更灵活的界面,并且如果您在 JDK7 或更高版本上运行,则支持设置子进程文件描述符。

启动一个使用默认工作目录和环境的新进程很容易:

 Process p = new ProcessBuilder("myCommand", "myArg").start();

【讨论】:

  • 我建议改用ProcessBuilder:它具有完全相同的功能,但API更更好。
  • @JoachimSauer 我是新来从 java 类调用进程的,我使用过 Runtime.exec。你为什么说 ProcessBuilder 有一个“更好的 API”?在什么方面?
  • @AlbertS: 几件事:你可以配置 ProcessBuilder 通过使用几个方法调用非常清晰的方法名称(.directory(new File("/tmp")) 说得很清楚),你可以简单忽略您不关心的方法调用,而不必将null 传递给某个位置的某个方法,您可以进行合理的重定向(自Java 1.7 起),并且可以操作起始环境变量使用简单的Map(例如在Runtime.exec() API 中,您可以添加条目到环境变量中。您可以替换 全部或使用默认)。
  • @JoachimSauer 非常感谢。现在我更好地理解了 ProcessBuilder 和 Runtime 之间的区别。
  • 我不能再编辑它,但是“在Runtime.exec() API 你可以添加条目”缺少一个not。
【解决方案2】:

查看 java.lang.Runtime#exec 和 java.lang.ProcessBuilder 的 javadoc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多