即時通訊嘗試爲包裝提供一個設計,以便在調用java中的命令行實用程序時使用。 runtime.exec()的問題在於你需要繼續讀取流出的錯誤流,或者在填充緩衝區時掛起。這使我下面的設計:圍繞命令行實用程序的包裝設計
public class CommandLineInterface {
private final Thread stdOutThread;
private final Thread stdErrThread;
private final OutputStreamWriter stdin;
private final History history;
public CommandLineInterface(String command) throws IOException {
this.history = new History();
this.history.addEntry(new HistoryEntry(EntryTypeEnum.INPUT, command));
Process process = Runtime.getRuntime().exec(command);
stdin = new OutputStreamWriter(process.getOutputStream());
stdOutThread = new Thread(new Leech(process.getInputStream(), history, EntryTypeEnum.OUTPUT));
stdOutThread.setDaemon(true);
stdOutThread.start();
stdErrThread = new Thread(new Leech(process.getErrorStream(), history, EntryTypeEnum.ERROR));
stdErrThread.setDaemon(true);
stdErrThread.start();
}
public void write(String input) throws IOException {
this.history.addEntry(new HistoryEntry(EntryTypeEnum.INPUT, input));
stdin.write(input);
stdin.write("\n");
stdin.flush();
}
}
而且
public class Leech implements Runnable{
private final InputStream stream;
private final History history;
private final EntryTypeEnum type;
private volatile boolean alive = true;
public Leech(InputStream stream, History history, EntryTypeEnum type) {
this.stream = stream;
this.history = history;
this.type = type;
}
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line;
try {
while(alive) {
line = reader.readLine();
if (line==null) break;
history.addEntry(new HistoryEntry(type, line));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的問題是與水蛭類(用於「螞蟥」的過程出來,犯錯流,並將它們送入歷史 - 這就像一個日誌文件) - 一方面,讀取整行很好,很容易(以及目前正在做的),但這意味着我錯過了最後一行(通常是提示行)。我只在執行下一個命令時看到提示行(因爲在那之前沒有換行符)。另一方面,如果我自己閱讀角色,如何知道過程何時「完成」? (完成或等待輸入) 有沒有人嘗試過等待100毫秒,因爲從過程的最後輸出並聲明它「已完成」?
任何更好的想法,我怎麼可以實現一個很好的包裝周圍的東西,如runtime.exec(「cmd.exe」)?
不是我正在尋找的東西,但可能是最接近的我即將獲得。 謝謝 – radai 2010-03-23 19:56:18
我對這個庫沒有任何問題,並且因爲它被信任在Maven 2中使用,我會說它是一樣好。 – 2010-03-24 14:05:19
我並不是想暗示代碼的質量。我只是說它並不是爲進程和java代碼之間的任何真正的交互而設計的 - 只是爲了運行外部進程並獲得單一結果 – radai 2010-03-24 20:45:53