在java中执行linux终端命令?

时间:2012-09-11 06:56:48

标签: java linux sox

我试图从java执行SOX命令,但遗憾的是它每次都会返回错误。其他每个SOX命令都运行得很好!! 这是代码:

class Simple {
    public static void main(String args[]) throws IOException, Exception {
        Process p;
        BufferedReader br;
        String co = "sox speech_16.wav -p pad 0 2.5 | sox - -m speech_16.wav speech_output.wav";
        p = Runtime.getRuntime().exec(co);
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            int returnCode = p.waitFor();
        System.out.println("reurn code : "+returnCode);         
    }
}

当我在终端中执行相同的sox命令时,它工作正常。我真的无法理解问题是什么!是因为' |'符号??

2 个答案:

答案 0 :(得分:8)

问题是Runtime.exec()不理解shell概念,例如“|”。而是尝试:

Runtime.getRuntime().exec("/bin/sh", "-c", co);

问题是exec直接运行二进制文件而不调用shell。 “|”字符只能由shell识别,而不是由sox识别。 “-c”告诉shell运行单个命令,并将整个命令作为单个参数传递。

答案 1 :(得分:-1)

这可能与执行命令的环境有关,可能是以下任何一种情况:

  • 找不到sox可执行文件(将完整路径放在命令中)
  • 用户无权运行sox命令(检查文件权限中的执行位)
  • 从Java运行命令时,sox所需的某些环境变量未初始化(请参阅sox文档)
  • 如果speech_16.wavsox的输入文件,则无法找到该文件(将.wav文件的完整路径添加到命令中)
  • 如果sox需要创建一个输出文件,那么由于目录权限,它没有这样做的权限,因为存在一个具有该名称但不能被覆盖的现有文件,或者由于缺少文件系统上的空间。