簡體   English   中英

如何將字節數組寫入進程構建器(Java)的OutputStream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM