[英]Efficient execution and output stream redirection of process spawned with Runtime.exec()
我有一個腳本,可以多次執行一個程序,從而向STDERR和STDOUT產生約350行輸出。 現在,我需要用Java執行腳本,從而將輸出流打印到其原始目的地。 因此,基本上,我從Java類內部執行腳本,從而維護了用戶的原始行為。
我這樣做的方法是受類似建議的啟發,例如從java Runtime.exec讀取流,並且在功能上工作正常。
Process p = Runtime.getRuntime().exec(cmdarray);
new Thread(new ProcessInputStreamHandler(p.getInputStream(), System.out)).start();
new Thread(new ProcessInputStreamHandler(p.getErrorStream(), System.err)).start();
return p.waitFor();
和類ProcessInputStreamHandler
:
class ProcessInputStreamHandler implements Runnable {
private BufferedReader in_reader;
private PrintStream out_stream;
public ProcessInputStreamHandler(final InputStream in_stream, final PrintStream out_stream) {
this.in_reader = new BufferedReader(new InputStreamReader(in_stream));
this.out_stream = out_stream;
}
@Override public void run() {
String line;
try {
while ((line = in_reader.readLine()) != null) {
out_stream.println(line);
}
} catch (Exception e) {throw new Error(e);}
out_stream.flush();
}
}
現在來看我的問題陳述:雖然腳本的執行大約需要17秒,但是“封裝的”執行至少需要21秒。 這4秒鍾或更多秒會在哪里丟失?
我已經嘗試過使用帶有STDERR重定向到STDOUT的ProcessBuilder
,使用POSIX vfork和類似https://github.com/axiak/java_posix_spawn之類的庫,使用字節緩沖區而不是BufferedReader
...一切都沒有積極的結果。
有什么建議嗎? 我了解會有一些性能損失,但是4秒對我來說似乎有點...
感謝任何建議!
最好的問候和在此先感謝。
完成任務的最快方法是使用Java 7和
return new ProcessBuilder(cmdarray).inheritIO().start().waitFor();
如果那沒有幫助,我認為您無能為力,因為其他所有方法都會在您的運行時環境中添加更多必須處理的代碼。
不知道它是否會提高性能,但是您可以嘗試使用NuProcess庫,該庫在提供非阻塞(異步)I / O的同時也將在Linux上使用vfork,這確實減少了進程啟動時間(和內存開銷)。相當多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.