在java中执行linux终端命令?

在java中执行linux终端命令?,java,linux,sox,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

我试图从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命令时,它工作正常。我真的不明白问题出在哪里!!是因为“|”符号吗

问题在于Runtime.exec()不理解诸如“|”之类的shell概念。相反,请尝试:

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

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

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

  • 找不到sox可执行文件(将完整路径放入命令中)
  • 用户没有运行
    sox
    命令的权限(检查文件权限中的执行位)
  • 从Java运行命令时,
    sox
    所需的某些环境变量未初始化(请查看sox文档)
  • 如果
    speech_16.wav
    sox
    的输入文件,则无法找到该文件(将.wav文件的完整路径添加到命令)
  • 如果
    sox
    需要创建输出文件,则由于目录权限、无法覆盖的现有文件名或文件系统上的空间不足,sox没有创建输出文件的权限

它返回1。实际上它应该返回0。那么sox返回代码1意味着什么(检查手册页)?@codebox意味着它的输出中有一些错误或者“输出文件”尚未生成!根据上面的命令,它应该生成一个名为“speech_output.wav”的文件。@codebox问题不在于该命令!我认为[我不确定]问题在于解析字符串时字符串的问题!!可能的重复不是目录路径,而是管道问题:但我真的需要包含“|”来工作。有没有办法把它包括进去?是的!成功了!!thanx@AdrianCox。这是因为管道符号。下面是代码:String[]co={”/bin/sh“,“-c”,“sox speech_16.wav-p pad 0 2.5 | sox--m speech_16.wav speech_output.wav”};p=Runtime.getRuntime().exec(co)@爱普萨隆你能不能就
-c
的论点进行辩论,好吗?@epsalon Thanx很多朋友:)它终于奏效了。这是因为命令中的管道符号。谢谢你的帮助(顺便说一句:)