我正在尝试在终端上执行命令。使用
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();
OutputStream stdin = process.getOutputStream();
InputStream stdout = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(stdout));
writer = new BufferedWriter(new OutputStreamWriter(stdin));
我将使用这个读者和作者不断地与过程沟通。
我使用以下循环阅读
while ((line = reader.readLine()) != null) {
System.out.println("line);
}
问题:这里的问题是,当读者从while缓冲区开始永久读取缓冲区时。它永远不会退出。
我试着将阅读放在一个帖子中
public void run() {
try {
String line;
outputText = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ex) {
Logger.getLogger(ThreadReader.class.getName()).log(Level.SEVERE, null, ex);
}
}
但现在我无法控制读者何时开始阅读。
目标:我需要执行一个命令并读取输出然后再执行下一个命令。
答案 0 :(得分:1)
您的Java程序正在与外部交互式进程通信。它只使用进程的输出和错误流来确定如何从任何给定点继续。如果您希望它识别输出的细分,例如对各个命令的响应,那么您需要教它们这些细分的边界是什么样的。
您可以通过多种方式解决问题。例如,如果外部程序在准备好接受新命令时发出提示,那么观察该提示似乎很自然。或者,也许您可以调整程序的输入,以便在每个命令的输出结束时生成一个可识别的标记。
还要考虑这是一个已解决的问题(很多次)。用于交互式程序的通用脚本的规范实用程序是名为" Expect"的Tcl程序。它激发了许多语言的工作,包括Java中的许多语言。 Google在前五次点击中给出了三个不同的例子,但我对其中任何一个没有具体经验,所以我不做任何推荐。