[英]Redirecting output of a process with Process Builder
我正在嘗試在自己的控制台窗口中運行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,讀取功能將永遠處於阻塞狀態(實際上,直到吐出汗水時,我才殺死進程)。 但是,錯誤流有效,即,如果我選擇了錯誤的選項,則會在控制台中收到消息。 我可能在這里缺少一些東西,正在尋求幫助。 謝謝
您已將plink
進程設置為將其輸出寫入連接到Java進程的管道。 plink
進程輸出的所有內容都將保存在操作系統緩沖區中,直到您的進程讀取它為止。 OS緩沖區的容量有限,如果plink
寫太多數據,它將阻塞,直到您的進程從緩沖區讀取一些數據為止。
不幸的是,在從管道讀取任何內容之前,java進程等待plink
進程完成。 因此,如果plink
進程寫入過多的輸出,它將無限期地阻塞。
您應該在調用waitfor()
之前更改java邏輯以讀取plink
進程的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.