[英]Running Unix Command in Java
我正在运行以下代码,它在waitfor()
function 处停止。 可能是什么原因,我该如何解决?
String line;
Process albumProcess;
try {
albumProcess = Runtime.getRuntime().exec(
"iconv -f UTF-16 -t UTF-8 /home/gozenem/"+ xmlFileName +
".xml | grep albumID");
albumProcess.waitFor();
BufferedReader in = new BufferedReader(
new InputStreamReader(albumProcess.getInputStream()));
ArrayList<String> lineList = new ArrayList<String>();
while ((line = in.readLine()) != null) {
lineList.add(line);
}
result[0] = lineList.size();
albumProcess.destroy();
} catch (Exception e) {}
该| grep...
| grep...
没有像您期望的那样从命令中使用 output,因为getRuntime().exec
不理解管道符号。 该过程陷入困境,等待某些东西消耗其 output并通过虚假命令行 arguments "|"
、 "grep"
和"albumId"
。
一个shell就懂了|
but execv
will not, so you need to use bash -c
instead to get a shell to do the piping (see java shell for executing/coordinating processes? do the piping yourself (see Pipe between java processes on command shell not reliable working ). Java 7 有一个新的ProcessBuilder
class 可以轻松设置管道,因此如果您只在前沿 JVM 上运行,您可以使用它们。
一旦你运行了grep
,如果有一堆匹配的行,它可能仍然会填满缓冲区,所以你需要坐在缓冲区上消耗进程的 output ZF7B44CFAFD5C52223D5498196 移动
albumProcess.waitFor();
在while
循环之后应该这样做。
我认为您应该在等待之前尝试从进程中读取 output。 否则,如果命令输出过多,则缓冲区可能会被填满。
看看这篇文章,它解释了如何从这个过程中读取: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.