java - 在 Java 中运行 Unix 命令

标签 java process

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

相关文章:

java - 如何通过Java中的sql查询确保mysql db中的数据立即更新

java - XmlJavaTypeAdapter 可以将对象编码到另一个对象吗?

java - XmlPullParser 获取子节点的首选方式?

java - 如何从 json 获取某些值(转换为文本)

c# - Windows 服务如何在引发计时器事件时启动进程?

c++ - 除了使用 ps 命令进行终端解析之外,是否有其他方法可以在 linux 中查找正在运行的进程

java - android studio中逐字节动态音频处理

python多处理找不到错误

android - 背景音乐会是一个单独的后台进程吗?

android - 当通过 Intent 调用 BroadcastReceiver 时,它在哪个进程上运行?