2016-03-15 56 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上的很多警告而停滞不前。感谢您的解释 –