[英]How to write a byte array to OutputStream of process builder (Java)
byte[] bytes = value.getBytes();
Process q = new ProcessBuilder("process","arg1", "arg2").start();
q.getOutputStream().write(bytes);
q.getOutputStream().flush();
System.out.println(q.getInputStream().available());
我正在嘗試將文件內容流式傳輸到可執行文件並捕獲輸出但輸出(InputStream)始終為空。 如果我指定文件位置而不是流輸入,我可以捕獲輸出。
我怎么能克服這個?
嘗試使用BufferedInputStream()
和BufferedOutputStream()
包裝您的流:
http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#getOutputStream%28%29
實現說明:緩沖輸出流是個好主意。
實現說明:緩沖輸入流是個好主意。
即使使用緩沖流,如果你處理大量數據,緩沖區仍然可以填充,你可以通過啟動一個單獨的線程來讀取q.getInputStream()
,這樣你仍然可以閱讀在寫入流程的過程中。
也許您執行的程序只有在檢測到輸入數據結束時才會開始工作。 這通常通過等待EOF(文件結束)符號來完成。 您可以通過關閉流程的輸出流來發送:
q.getOutputStream().write(bytes);
q.getOutputStream().close();
與等待過程一起嘗試。
我想,你必須等待,直到這個過程結束。 我用這種方式實現了這樣的東西:
public class ProcessReader {
private static final int PROCESS_LOOP_SLEEP_MILLIS = 100;
private String result;
public ProcessReader(Process process) {
BufferedReader resultReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder resultOutput = new StringBuilder();
try {
while (!checkProcessTerminated(process, resultReader, resultOutput)) {
}
} catch (Exception ex1) {
throw new RuntimeException(ex1);
}
result = resultOutput.toString();
}
public String getResult(){
return result;
}
private boolean checkProcessTerminated(Process process, BufferedReader resultReader, StringBuilder resultOutput) throws Exception {
try {
int exit = process.exitValue();
return true;
} catch (IllegalThreadStateException ex) {
Thread.sleep(PROCESS_LOOP_SLEEP_MILLIS);
} finally {
while (resultReader.ready()) {
String out = resultReader.readLine();
resultOutput.append(out).append("\n");
}
}
return false;
}
}
我剛剛刪除了一些您不需要的特定代碼,但它應該可以使用,試一試。 問候
我不知道其他的東西是否也可能出錯,但是其他過程(“過程”)甚至沒有時間回應,你沒有等待它(可用的方法()不會阻止)。 可用() 多次在兩者之間短暫停嘗試了這一點,你可以沖洗(后先插入一個sleep(2000)),以及是否工作,你應該切換到query'ing q.getInputStream()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.