Java 监督生成的进程的输入流
我正在尝试生成以下bash脚本并异步捕获其标准输出:Java 监督生成的进程的输入流,java,clojure,Java,Clojure,我正在尝试生成以下bash脚本并异步捕获其标准输出: #!/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 = p
#!/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
节点示例 为了进一步阐明我的意图,这里有一个Node.JS的JavaScript代码,它正是我想要的:
const spawn = require('child_process').spawn;
const sleeper = spawn('sleeper');
sleeper.stdout.on('data', (data) => {
if (data.toString() === "two\n") {
doSomeAction();
}
});
您可以将中的工具与简单的Java互操作结合使用
以下是一些让您开始学习的代码:
(需要“[clojure.java.io:参考[reader]”)
(让[进程(.start(ProcessBuilder.[../sleeper]]))
(使用打开的[r(读取器(.getInputStream进程))]
(doseq[行(行序号r)]
(当(=第二行)
(打印行(()()))
将其粘贴到REPL中,您应该会看到经过适当延迟后输出的
two
。是否希望在单独的线程中完成输入流处理,并从另一个线程进行控制?或者它应该只处理进程,直到它获得特定的数据或者进程终止?不,据我判断,不需要单独的线程。子流程(“睡眠者”)不是一个繁重的计算应用程序。它实际上是一个运行小型服务器的unix工具,因此它实际上可以无限运行。然而,对我的应用程序来说重要的是,它在监督子进程时不会被阻止。其他一切都应该继续…您还可以将其包装成一个未来的,这样您的主应用程序线程就不会被阻塞,可以继续执行。@PiotrekBzdyl Right.-我只是注意到这个问题需要一个不阻塞主线程的解决方案。我觉得如果不知道程序在主线程中做什么,我就无法回答这个问题……祝你好运!尽管在我看来它仍然像魔术。我不知道惰性序列可以像这样异步…@AntonHarald你是什么意思?惰性序列不是异步的。