【问题标题】:Runtime exec doesn't show results运行时 exec 不显示结果
【发布时间】:2018-07-04 06:43:34
【问题描述】:

我正在尝试使用以下代码在 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

 你好示例文本

【问题讨论】:

    标签: java netbeans runtime exec


    【解决方案1】:

    有两个系统相关的东西。

    首先,在读取程序的输出之前,您正在通过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),您告诉它将任何错误输出写入与标准输出相同的通道,因此只有一个输出要处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 2012-12-31
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多