在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命令(我真的不认为我可以在这里做)我不知道这里发生了什么。有什么建议吗?
答案 0 :(得分:0)
在开始此过程后添加while(p.getInputStream().read() != -1);
之类的内容。缓冲区将被填充,进程将停止等待某些东西(在这种情况下,您的程序)从中读取以释放空间。
答案 1 :(得分:0)
我明白了!这里的问题确实是输出流需要刷新以便应用程序退出,但仅仅从流中读取是不够的。我使用了Suresh Koya的建议并使用了processBuilder api,并在启动它之前重定向了流程上的错误流,并从流中读取。这解决了我遇到的问题:D