监督产生过程的InputStream

时间:2016-03-31 19:20:52

标签: java clojure

我尝试生成以下bash脚本并异步捕获其stdout:

#!/bin/bash

sleep 2;
echo "one";
sleep 2;
echo "two";
sleep 2;
echo "three";
# ... possibly infinite..

到目前为止,这是Java代码:

ProcessBuilder pb = new ProcessBuilder("sleeper");
Process process = pb.start();
InputStream input = process.getInputStream();

// now I continue in pseudo-code:

supervise the input-stream.
whenever a new line arrives:
    check if the line equals "two";
       then: doSomeAction();

注意:我实际上并没有用Java编写程序。我是在Clojure中写的,但我还没有找到Clojure方法。所以我试图使用Clojure包装的Java本机API。

一个nodejs示例

首先澄清我的意图,这里是Node.JS的JavaScript代码,它完全符合我的要求:

const spawn = require('child_process').spawn;
const sleeper = spawn('sleeper');

sleeper.stdout.on('data', (data) => {
  if (data.toString() === "two\n") {
      doSomeAction();
  }
});

1 个答案:

答案 0 :(得分:2)

您可以使用http://www.w3schools.com/cssref/pr_background-position.asp中的工具以及简单的Java互操作。

以下是一些可以帮助您入门的代码:

(require '[clojure.java.io :refer [reader]])

(let [process (.start (ProcessBuilder. ["./sleeper"]))]
  (with-open [r (reader (.getInputStream process))]
    (doseq [line (line-seq r)]
      (when (= line "two")
        (println line)))))

将其粘贴到您的REPL中,您应该在适当的延迟后看到two输出。

相关问题