gpt4 book ai didi

java - 在 Java 中运行 Unix 命令

转载 作者:行者123 更新时间:2023-12-02 00:38:34 28 4
gpt4 key购买 nike

我正在运行以下代码,它在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com