Java 爪哇元';不执行命令行?

Java 爪哇元';不执行命令行?,java,shell,cmd,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”的内容时,代码将正常工作 知道为什么吗?问题是文件通配符模式没有通过扩展。因此,该模式被逐字处理,并且找不到该文件。您需要一个shell,如bash来解释这一点: Process

我尝试用java运行这个shell,但它从来都不起作用

Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
当我将cmd更改为类似“
ls
”或“
open foo.java
”的内容时,代码将正常工作


知道为什么吗?

问题是文件通配符模式没有通过扩展。因此,该模式被逐字处理,并且找不到该文件。您需要一个shell,如
bash
来解释这一点:

Process p = Runtime.getRuntime().exec(new String[] { 
                   "bash", "-c", 
                   "cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });
一定要检查文件的内容


旁白:考虑使用VARARGS数组建立命令<代码>字符串 >更方便。

这里有一些问题。

  • *.java
    部分是一个通常由shell扩展的glob
  • 从一个进程到另一个进程组装管道也是一个shell特性
  • 输出重定向是一个shell功能
  • 基本上,您确实需要调用shell来运行这种类型的管道。
    exec
    方法运行带有参数的特定程序。您可以通过直接调用shell并将命令行作为参数传递来实现这一点,但我怀疑这是否可行


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

    (1)实际发生了什么?您是否收到任何错误消息?(2) 您的命令是否直接从shell工作?是的,当我手动键入时,命令完全工作!错误说明文件dos不存在。您是直接从shell还是从某个IDE运行Java程序?我尝试使用“cat*.Java>>a.Java”。错误是:cat:*.java>>a.java:没有这样的文件或目录我从cmd行运行java