【发布时间】:2016-06-01 13:24:26
【问题描述】:
我正在尝试在终端上执行命令。使用
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));
我将使用这个 reader 和 writer 来不断地与进程进行通信。
我正在使用以下循环读取
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);
}
}
但现在我无法控制阅读器何时开始阅读和结束阅读。
目标:我需要执行一个命令并读取输出,然后读取下一个命令。
【问题讨论】:
-
为什么您无法控制阅读器何时启动?那是你开始线程的时候吗? (或者最好将其安排在线程池中)。当进程终止或关闭其输出/错误流时,您的阅读器会停止。如果这个过程不这样做,那么你的读者就不会停止。
-
尝试使用某个流结束标记来告诉读者何时需要完成(或休息一下)。否则它将无限期地等待新输入,因为它不知道其他进程是否已完成写入流。
-
“我需要执行一个命令并读取输出……”解释一下“读取输出”的实际含义。读取一行输出?读五行?读取所有剩余的输出?
-
检查 line.length() != 0
标签: java process bufferedreader