我正在尝试在自己的控制台窗口中运行plink。我开始使用Process.exec(),并且工作正常。我开始使用ProcessBuilder,现在直到我终止进程才输出输出。
我的代码如下所示:
class ConsoleOutputThread extends Thread {
public void start(String processName) {
// this was old code: Runtime r = Runtime.getRuntime();
try {
builder = new ProcessBuilder("plink", "-ssh", "192.168.3.21");
builder.redirectErrorStream(true);
process = builder.start();
//this was old code: process = r.exec (processName);
} catch (IOException ex) {
}
start();
}
@Override
public void run() {
try {
BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
try {
process.waitFor();
} catch (InterruptedException ex) {
}
char b[];
b = new char[1];
while(is.read(b, 0, 1)> 0) {
// this is for debug, normally sent to console
System.out.println("Got character: " + b[0]);
}
} catch (IOException ex) {
}
}
}
因此,使用Runtime.exec()时一切正常。现在,使用ProcessBuilder,读取功能永远阻塞(实际上,直到我杀死进程,然后进行任务)。但是,错误流有效,即如果我选择了错误的选项,我会在控制台中收到消息。 我可能在这里缺少一些东西并寻求帮助。 谢谢
答案 0 :(得分:0)
您已将plink
进程设置为将其输出写入连接到java进程的管道。 plink
进程输出的任何内容都将保存在操作系统缓冲区中,直到您的进程读取它为止。 OS缓冲区的容量有限,如果plink
写入太多数据,那么它将阻塞,直到您的进程从缓冲区中读取一些数据。
不幸的是,java进程在从管道读取任何内容之前等待plink
进程完成。因此,如果plink
进程写入太多输出,它将无限期地阻塞。
在调用plink
之前,您应该更改java逻辑以读取waitfor()
进程的输出。