簡體   English   中英

Java output 在使用 BufferedReader 時被覆蓋

[英]Java output from process buider overwritten when using BufferedReader

我正在嘗試在 Java 中運行外部程序並讀取 output。 該程序是 C++ 中的 Linux 應用程序,它運行數據挖掘算法並打印在標准 output 上找到的模式。 我希望能夠從我的 Java 應用程序中讀取 output 並使用表格顯示模式。 問題是 output 的大小相當大(作為測試,它在大約 30 秒內產生 6.5MB)。 我正在使用 ProcessBuilder 並使用使用 BufferedReader 緩沖的 InputStreamReader 讀取 output,如以下代碼所示:

      String[] cmd = {"./clogen_periodic", selected, support, "-t 4"};
      Process p = new ProcessBuilder(cmd).start();
      input = new BufferedReader (new InputStreamReader(p.getInputStream()));

      while ((line = input.readLine()) != null) {
         ...
         process line;
         ...
      }

問題是 output 已損壞。 當我在控制台上執行相同的程序時,output 是正確的,但是當我使用 Java 應用程序時,一些行被合並了。 更准確地說 output 應該是這樣的

      TMEmulation log_pseduo_allocation (34985) (2 45 76 89 90)
      __divw clock timer (8273) (4 6 67 4 2)

但就是這樣

      TMEmulation log_pseduo_allocation (34985) (2__divw 45clock 76timer (89 8273) 904) (6 67 4 2)

對可能的問題有任何想法嗎?

非常感謝,帕特里夏

與被調用程序有關的一些可能性

1) 正如@Artefacto 所說,C++ 程序 output 可能沒有完全緩沖,因此調用 setvbuf 使其一致。 即第一個 output 被部分緩沖,第二個不是,所以在第二個結束后第一次刷新。 一般來說,如果從命令行和進程調用,緩沖可能會有所不同。

2)程序是多線程的,當從 java 調用時,output 的行為不同,因此 output 時序不同。

基本上,您需要查看被調用程序的代碼,以強制記錄/輸出全部通過同一個調用。

您應該在單獨的線程中讀取 stdout 和 stderr 以避免阻塞問題。 我不能確定這是否會解決您的問題,但無論如何都應該這樣做以避免您可能遇到的其他問題(例如,您的應用程序可能會死鎖等待標准輸出)。

幸運的是,有一個非常好的示例代碼可以引導您完成此操作。 http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

文章指出(見第 2 頁底部),即使您不需要 output 來防止可能的死鎖,您也應該始終從 stderr 和 stdout 讀取。

Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

嘗試在 C++ 程序中調用, setvbuf帶有選項_IOLBF 暴露給 C++ 的 pipe 的結尾可能是無緩沖的,而當您從命令行運行程序時使用| ,它是行緩沖的。

如果您正在執行 System.out.print() 或當前在每次迭代中進行調試的任何操作,請嘗試將所有迭代中的所有行放入一個字符串中並嘗試一下。

也許您的 output 方法會異步打印出來。 因此,您打印的 output 可能已損壞,但不是您從輸入 stream 獲得的損壞。

只是一個想法...

暫無
暫無

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

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