我尝试在 java 中运行这个 shell,但它永远不会工作。
Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
当我将 cmd 更改为“ ls
”或“ open foo.java
”之类的代码时,代码将起作用。
知道为什么吗?
问题是文件通配符模式没有被glob扩展。因此,模式按字面意思处理,找不到文件。你需要一个 shellbash
来解释这个:
Process p = Runtime.getRuntime().exec(new String[] {
"bash", "-c",
"cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });
确保检查getErrorStream的内容。
旁白:考虑使用更方便的ProcessBuilder,它使用 varargs 数组来构建 command String
。
这里有几个问题。
*.java
部分是一个通常由外壳扩展的球体基本上,您确实需要调用 shell 来运行这种类型的管道。该exec
方法运行带有参数的特定程序。您可以通过直接调用 shell 并将命令行作为参数传递来使其工作,但我怀疑这也行得通。
您可能必须cat *.java
通过枚举目录内容并分别读取每个文件来实现该部分。Process
为每个命令打开单独的实例,sed
并使用实例的输入和输出流实现它们之间的管道Process
。