我试图使用bash命令获取带有Java的视频文件的持续时间
avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//
当我在终端输入上述命令时,终端中只显示一条输出行,显示如下持续时间:
00:09:56.45
现在我想从Java运行此命令并以字符串形式接收输出的持续时间。我的代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String[] args){
String command = "avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//";
StringBuffer output = new StringBuffer();
Process p;
String result = "init";
try {
p = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
result = in.readLine();
in.close();
} catch (IOException e) { e.printStackTrace(); }
System.out.println(result);
}
}
然而,这会返回null
。因此,result
的值会被result = in.readLine())
更改,但是,result = null
将被设置为in.readLine())
,而不是实际的终端输出。
所以{{1}}似乎没有接收到命令的输出,即使在我输入命令时在终端中完美输出。
为什么Java不能读取此终端输出?
答案 0 :(得分:0)
使用此 - >
try{
Process duration = Runtime.getRuntime().exec(new String[] { "sh", "-c", "avconv -i test.avi 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//"});
String line
BufferedReader in = new BufferedReader(new InputStreamReader(duration.getInputStream()) );
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}catch(IOException e){
e.printStackTrace();
}