为了账号安全,请及时绑定邮箱和手机立即绑定

运行时执行器不显示结果

运行时执行器不显示结果

心有法竹 2021-05-01 18:40:37
我正在尝试使用以下代码在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){            //    }并希望获得以下输出,但在控制台中不会显示任何内容。用法:javac  可能的选项包括:  -g生成所有调试信息  -g:none不生成任何调试信息  -g:{lines,vars,source}仅生成一些调试信息  -nowarn不生成警告java -cp my.jar com.my.sample 你好样本文本
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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


首先,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),您告诉它将所有错误输出与标准输出写入同一通道,因此只有一个输出要处理。


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信