0

在一个 java 程序中,我正在生成一个用于 centOS 机器的 sh 脚本,它将使用 sox 和 lame 来解码 MP3 音频文件,然后分别对文件应用一些增益。我有一些问题让 Process.waitFor() 方法做任何事情,而不是无限期地挂起。这是代码:

            try
    {
    // TODO code application logic here
        String reviewPath = "/SomeDirectory/";
        String fileName = "FileName";
        String extension = ".mp3";
        StringBuilder sb = new StringBuilder();
        sb.append("#!/bin/bash\n");
        sb.append("cd " + reviewPath + "\n");
        sb.append("lame --decode " + fileName + extension + "\n"); 
        File script = new File(reviewPath + fileName + ".sh");
        script.createNewFile();
        script.setExecutable(true);
        FileWriter writer = new FileWriter(script);
        writer.write(sb.toString());
        writer.close();
        Process p = Runtime.getRuntime().exec(script.getAbsolutePath());
        String line;
        BufferedReader bri = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
        BufferedReader bre = new BufferedReader
            (new InputStreamReader(p.getErrorStream()));
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
        bri.close();
        while ((line = bre.readLine()) != null) {
            System.out.println(line);
        }
        bre.close();
        p.waitFor();
        System.out.println("Done.");

    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

奇怪的是,当我运行它手动生成的 .sh 文件时,它会很好地运行并退出,但是当我从 java 中的进程对象执行它时,它永远不会退出。进程的 exitValue 始终为“进程尚未退出”。我尝试将 set -e 添加到脚本中,然后退出到脚本的末尾。没有使用 kill 命令(我真的不认为我可以在这里做)我不知道这里发生了什么。有什么建议么?

4

2 回答 2

0

while(p.getInputStream().read() != -1);在开始该过程后添加类似的内容。缓冲区将被填满,进程将停止等待某些内容(在本例中为您的程序)从中读取以释放空间。

于 2012-11-21T20:29:39.437 回答
0

我想到了!这里的问题确实是需要刷新输出流以使应用程序退出,但仅从流中读取是不够的。我使用了 Suresh Koya 的建议并使用了 processBuilder api,并在启动之前重定向了进程上的错误流,并从流中读取。这解决了我遇到的问题:D

于 2012-11-21T21:09:53.897 回答