簡體   English   中英

讀取外部過程的輸出

[英]Read output from external process

我正在嘗試運行.csh腳本並將其輸出讀取到StringBuffer中。 盡管從控制台運行腳本會返回一些輸出,但有時輸出仍為空。 相同的運行流有時可以返回輸出,有時不能返回輸出,盡管進程啟動的方式沒有變化(相同的腳本,path和args),並且腳本也沒有更改。 我沒有拋出任何異常。 是什么導致現在正確/成功讀取輸出? 代碼段是

public static String getOutpoutScript(Process p) {
    InputStream outpout = p.getInputStream();
    logger.info("Retrived script output stream");
    BufferedReader buf = new BufferedReader(new InputStreamReader(outpout));
    String line = "";
    StringBuffer write = new StringBuffer();

    try {
        while ((line = buf.readLine()) != null) {
            write.append(line);
        }
    } catch (IOException e) {
        // do something
    }

    return write.toString().trim();

}

除了不關閉流的事實,這還不好,在某些情況下,這還是代碼中的其他內容可能會阻止輸出被正確讀取?

謝謝,

如果使用ProcessBuilder啟動它,則可以將錯誤流合並到輸出流中。 這樣,如果程序打印到stderr,您也將捕獲它。 另外,您也可以閱讀兩者。 此外,您可能不想使用readLine,如果程序未在行末顯示行末字符,則可能會停留一段時間。

也許您必須將p.getInputStream()替換為p.getOutputStream()

除此之外,有時進程可能會阻塞等待輸入的過程,因此您必須異步讀取和寫入-一種可能的解決方案是使用不同的線程-例如,一個線程正在讀取,另一個線程正在寫入,而一個線程正在監視進程。

如果有錯誤,則默認情況下將寫入getErrorStream()。 如果您有問題,我將確保您正在某處閱讀。

如果該流的緩沖區已滿,您的程序將停止,等待您讀取它。

解決這些問題的簡單方法是使用ProcessBuilder .redirectErrorStream(true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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