繁体   English   中英

在 Java 中运行 Unix 命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM