java-运行时exec不显示结果

我正在尝试使用以下代码在netbeans中获取Java命令的结果:

    Runtime rt = Runtime.getRuntime();
    Process p = null;

    try {
        String cmd = "javac";
        // OR String cmd = "cmd /c javac";
        // OR String cmd = "java -cp myjar com.my.sample";
        p = rt.exec(cmd);            
        p.waitFor();

        BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String line = null;

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

    } catch(Exception e){
            //
    }

并期望具有以下输出,但控制台中未显示任何内容.

Usage: javac  
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings

java -cp my.jar com.my.sample

 Hello Sample Text

解决方法:

有两个与系统有关的东西.

首先,您需要先通过p.waitFor()等待过程完成,然后再读取程序的输出.当管道的容量用尽时,这可能会永远阻塞,因为该程序只有在写入所有输出后才能完成.管道的实际容量取决于系统且未指定.

此外,由于不提供任何参数是错误的情况,因此可能是消息已写入错误流而不是标准输出的情况.在这种情况下,您将必须读取p.getErrorStream()而不是p.getInputStream()(在我的系统上不是这种情况).

因此,您可以尝试

Runtime rt = Runtime.getRuntime();
try {
    String cmd = "javac";
    // OR String cmd = "cmd /c javac";
    // OR String cmd = "java -cp myjar com.my.sample";
    Process p = rt.exec(cmd);
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 

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

    p.waitFor();
} catch(Exception e){
    e.printStackTrace();
}

如果完成后没有打印任何内容,请尝试使用p.getErrorStream()而不是p.getInputStream().

但是,如果您只想将子流程的输出打印到控制台,则可以做得更好:

try {

    String cmd = "javac";
    // OR String cmd = "cmd /c javac";
    // OR String cmd = "java -cp myjar com.my.sample";
    Process p = new ProcessBuilder(cmd).inheritIO().start();
    p.waitFor();
} catch(Exception e){
    e.printStackTrace();
}

这会将您的输入和输出通道连接到子流程的输入和输出通道.因此,在这种情况下,您无需处理管道.

但是,如果您实际上想在程序中处理输出,即打印只是一个示例,则ProcessBuilder仍然有一个有趣的选项:

try {
    String cmd = "javac";
    // OR String cmd = "cmd /c javac";
    // OR String cmd = "java -cp myjar com.my.sample";
    Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 

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

    p.waitFor();
} catch(Exception e){
    e.printStackTrace();
}

通过使用redirectErrorStream(true),您可以告诉它将任何错误输出写入与标准输出相同的通道中,因此只有一个输出要处理.

上一篇:使用PHP的内置服务器设置Eclipse PDT


下一篇:Netbeans PHP-添加/删除花括号插件/快捷方式