2012-12-16 50 views
0

所以我有一個java程序通過ProcessBuilder調用一個C程序,並且我需要C程序在出現問題時通知Java程序。我有以下代碼爲java編:在java中讀取c程序的stdout

String cmd[] = //string to run the c program in the terminal, no probs here 
    ProcessBuilder builder = new ProcessBuilder(cmd); 
    builder.redirectErrorStream(true); 
    Process process = builder.start(); 

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    System.out.println(bufferedReader.ready()); 
    System.out.println(bufferedReader.readLine()); 

在給定點的c程序將不得不通知Java程序的東西。我已經嘗試了很多東西像

char Buff[] = "output"; 
write(0, Buff, strlen(Buff)+1); 
write(1, Buff, strlen(Buff)+1); 
printf("output\n"); 

但我不能讓Java程序讀取此,我得到的唯一輸出是

false 
null 
+1

你不應該在設置流讀取器來聽取它的輸出之後啓動()處理*嗎? – Vulcan

+1

我對這個東西一無所知,所以如果我現在很傻,請和我一起裸露,但對我來說,它看起來像你正在閱讀stderr而不是標準輸出,這聽起來像是你想閱讀...? –

+2

它可以是'char Buff [] =「output \ n」; write(1,Buff,strlen(Buff));'或'printf(「output \ n」); fflush(stdout中);' – melpomene

回答

2

的Java程序將無法看到輸出,直到緩存被刷新。

write級別的緩衝取決於操作系統,即使在同一個操作系統中,不同類型的流可能有不同的默認緩衝模式。在Linux中,文檔暗示write到管道會立即被其他進程讀取,並且ProcessBuilder至少在Android中使用管道。

如果您使用stdio.h,那麼fflush將可移植地將數據一直推出到套接字或管道。例如。我使用ProcessBuilder在Android上爲此目的成功使用了fflush

線路緩衝是操作系統的另一種可能的選擇。在這種情況下,在您的郵件中附加\n可能會產生影響。

順便說一句,混合writeprintf在同一個程序中調用是麻煩。並且如前所述,write(0是嘗試寫入stdin,並且strlen(buf)+1導致將最終的零字節發送到Java程序,這不太可能是您想要的。