我正在运行以下代码,它在 waitfor()
函数处停止。可能是什么原因以及如何解决?
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 ...
没有按照您的预期使用命令的输出,因为 getRuntime().exec
不理解管道符号。该进程陷入困境,等待某些东西消耗其输出和它被传递的虚假命令行参数“|”
,“grep”
和“albumId”
。
shell 会理解 |
但 execv
不会,因此您需要使用 bash -c
来让 shell 执行以下操作管道(请参阅 java shell for executing/coordinating processes? 自己进行管道操作(请参阅 Pipe between java processes on command shell not reliable working )。Java 7 有一个新的 ProcessBuilder
类,可以轻松设置管道,因此如果您仅在前沿 JVM 上运行,则可以使用这些管道.
一旦你运行了grep
,如果有一堆匹配的行,它可能仍然会填满缓冲区,所以你需要在缓冲区上放置一些东西来消耗进程的输出流。搬家
albumProcess.waitFor();
在 while
循环之后应该执行此操作。
关于java - 在 Java 中运行 Unix 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7028962/