我尝试生成以下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();
}
});
答案 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
输出。