Java不会执行cmd行吗?

时间:2013-04-26 01:39:12

标签: java shell cmd

我尝试在java中运行此shell但它永远不会工作。

Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");

当我将cmd更改为“ls”或“open foo.java”时,代码将有效。

知道为什么吗?

2 个答案:

答案 0 :(得分:1)

问题是文件通配符模式没有被glob扩展。因此,字面上处理模式并且找不到文件。你需要一个像bash这样的shell来解释这个:

Process p = Runtime.getRuntime().exec(new String[] { 
                   "bash", "-c", 
                   "cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });

请务必查看getErrorStream

的内容

除此之外:考虑使用更方便的ProcessBuilder,它使用varargs数组来构建命令String

答案 1 :(得分:0)

这里有一些问题。

  1. *.java部分是一个通常由shell扩展的glob
  2. 从流程到流程组装管道也是一个shell功能
  3. 输出重定向是一个shell功能
  4. 基本上,您确实需要调用shell来运行此类型的管道。 exec方法使用参数运行特定程序。您可以通过直接调用shell并将命令行作为参数传递来使其工作,但我怀疑它是否也可以。

    您可能必须通过枚举目录内容并分别读取每个文件来实现cat *.java部分。为每个Process命令打开单独的sed实例,并使用Process实例的输入和输出流实现它们之间的管道。