2010-09-27 103 views
2

我试图远程执行一个.bat文件和执行的代码下面几行后卡住:while循环的ProcessBuilder得到得到一个错误

ProcessBuilder processBuilder = new ProcessBuilder(command); 
    final Process process = processBuilder.start(); 

    InputStream stderr = process.getErrorStream(); 
    InputStreamReader isr = new InputStreamReader(stderr); 
    BufferedReader br = new BufferedReader(isr); 
    String line = null; 


    while ((line = br.readLine()) != null) { 
     System.out.println(line); 

    } 
    process.waitFor(); 
    System.out.println("Waiting ..."); 

    System.out.println("Returned Value :" + process.exitValue()); 

,但我的程序卡住内。 它显示的错误是:

CMD.EXE was started with the above path as the current directory. 
UNC paths are not supported. Defaulting to Windows directory. 

它永不熄灭的同时loop.But它成功地执行脚本。 任何形式的帮助表示赞赏。谢谢

回答

3

你需要确保你也处理stderr,你应该在不同的线程中处理两个流。

阅读this并确保你按照所有的意见。

编辑:看看你写的代码,你似乎已经从这篇精确的文章中复制了代码。实际上,它看起来像清单4.3(MediocreExecJavac.java)。

+2

或者,调用'processBuilder.redirectErrorStream(true);'将进程的标准错误重定向到它的标准输出。那么你只需要从'process.getInputStream()'读取。 – 2010-09-27 22:02:27

2

在.start()和getInputStream()之前添加redirectErrorStream(true)。这将读取stderr并将其与stdout合并为一个可以使用getInputStream()读取的响应。

ProcessBuilder processBuilder = new ProcessBuilder(command); 
    processBuilder.redirectErrorStream(true); 
    final Process process = processBuilder.start(); 

    InputStream stderr = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(stderr); 
    BufferedReader br = new BufferedReader(isr); 
    String line = null; 


    while ((line = br.readLine()) != null) { 
     System.out.println(line); 

    } 
    process.waitFor(); 
    System.out.println("Waiting ..."); 

    System.out.println("Returned Value :" + process.exitValue());