Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 监督生成的进程的输入流_Java_Clojure - Fatal编程技术网

Java 监督生成的进程的输入流

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

我正在尝试生成以下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 = 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你是什么意思?惰性序列不是异步的。