Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Runtime exec不';不显示结果_Java_Netbeans_Runtime_Exec - Fatal编程技术网

Java Runtime exec不';不显示结果

Java Runtime exec不';不显示结果,java,netbeans,runtime,exec,Java,Netbeans,Runtime,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

我尝试使用以下代码在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 用法:javac 可能的选择包括: -g生成所有调试信息 -g:无生成调试信息 -g:{lines,vars,source}只生成一些调试信息 -nowarn不生成警告 java-cp my.jar com.my.sample

Hello Sample Text Hello示例文本
有两个依赖于系统的东西

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