如何在Java中编写子进程的输出

时间:2011-07-01 13:24:13

标签: java

我在Eclipse中编写了一个java代码,我正在开发一个在工作台上嵌入按钮的插件。单击此按钮时,将打开批处理文件(位于c:/program file/prism 4.0/bin

代码成功打开.bat文件!但我的下一个任务是在我的控制台上写下该批处理文件的输出。我正在使用Eclipse IDE版本3。

我的代码是

MessageConsoleStream out = myConsole.newMessageStream();
        out.println("We are on console ! \n Shubham performed action");


try {

      ProcessBuilder pb=new ProcessBuilder("C:\\Program Files\\prism-4.0\\bin\\prism.bat");
        pb.directory(new File("C:\\Program Files\\prism-4.0\\bin"));
        Process p=pb.start();

        int exitVal=p.waitFor();            

       out.println("Exited with error code "+exitVal+" shown and action performed \n");

            out.println("Shubham Process Successful");
            out.println("Printing on console");

        }
        catch (Exception e)
        {
            out.println(e.toString());
            e.printStackTrace();

        }
    } 

3 个答案:

答案 0 :(得分:0)

这样做:

.....
Process p = pb.start();

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

String in;
while((in = input.readLine()) != null) {
    out.println(in);
}

int exitVal = p.waitFor();
.....

请注意,如果批处理文件写入标准错误,则java程序必须使用它,否则p.waitFor()将永远不会返回。

答案 1 :(得分:0)

帮自己一个大忙,查看http://commons.apache.org/exec/。它将处理关于managnig外部进程的所有可怕细节:超时,处理输入/输出,甚至创建命令行将更容易且更不容易出错

答案 2 :(得分:0)

请注意,要正确读取Process的InputStream,您应该在单独的Threads上执行此操作。请参阅this similar question