2016-03-15 83 views
0

在我的程序中,我試圖通過Java代碼執行make進程getInputStream()永不結束

這裏我上市的一部分:

this.makefileGenerator.generate(); 

Process proc = this.makefileGenerator.runCompiler(); 

//this.stream.println(IOUtils.toString(proc.getInputStream())); 
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
String line; 
while ((line = reader.readLine()) != null) 
    System.out.println("\n" + line); 

try { 
    int result; 

    if ((result=proc.waitFor()) == 0) 
     this.stream.println("Done!"); 
    else { 

的執行似乎proc.getInputStream()通話過程中被阻塞。事實上,我的程序不會崩潰,但永遠不會終止。

在控制檯輸出I有:

make: Entering directory '/cygdrive/c/Users/cr01046/Documents/workspace/ocelot/jni' 
gcc -shared -m32 -D__int64=int64_t -LC:/gtk/lib -lintl -mms-bitfields -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include -IC:/'Program Files'/Java/jdk1.8.0_73/include -IC:/'Program Files'/Java/jdk1.8.0_73/include/win32 -o ../Test.dll lists.c ocelot.c EN_CBridge.c main.c -lglib-2.0 

我也試圖拋出make通過及時和正確編譯終止(但是,有幾個警告)。我不明白爲什麼在這種情況下make有效,而通過Java它不會終止。

+0

你怎麼知道它在getInputStream()中被阻塞?我會將這組嵌套的調用分成單獨的語句以確認它被阻塞的位置。 –

+0

你的'System.out.println'指令似乎可行,所以問題不在讀者創建部分。 – Berger

回答

1

如果您的編譯生成警告,但從Java運行時看不到警告,則警告將寫入STDERR,並且您沒有使用STDERR。根據錯誤輸出的數量,當緩衝區運行滿時,make過程可能會停止。

如果使用ProcessBuilder創建Process,則應該調用redirectErrorStream(true)將錯誤輸出與標準輸出合併。

+0

我的'make'進程實際上因STDERR上的很多警告而停滯不前。感謝您的解釋 –