Reading streams from java Runtime.exec

前端 未结 1 1553
北海茫月
北海茫月 2020-11-28 14:47

I have the following snippet of code:

Process proc = runtime.exec(command);
errorGobbler = new ErrorStreamGobbler(proc.getErrorStream(), logErrors, mdcMap);
         


        
相关标签:
1条回答
  • 2020-11-28 15:36

    I've struggled with the same kind of issues. I can't remember what exactly was wrong (maybe I forgot to flush / close the streams correctly or something ...). Anyway, here is what I came up with.

    /**
     *  Handle communication with a process, reading its output/error and feeding its input
     *  @param process The process to execute
     *  @param _in Reader that will feed the input pipe of the process
     *  @param out Writer that will receive the output of the process
     *  @param err Writer that will receive the error pipe of the process
     */
    public static void communicate(
            Process process,
            final Reader _in,
            final Writer out,
            final Writer err)
    {
        // Buffer the input reader
        final BufferedReader in = new BufferedReader(_in);
    
        // Final versions of the the params, to be used within the threads
        final BufferedReader stdOut = new BufferedReader(new InputStreamReader(process.getInputStream()));
        final BufferedReader stdErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        final BufferedWriter stdIn = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
    
        // Thread that reads std out and feeds the writer given in input
        new Thread() {
            @Override public void run() {
                String line;
                try {
                    while ((line = stdOut.readLine()) != null) {
                       out.write(line + newline);
                    }
                } catch (Exception e) {throw new Error(e);}
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) { /* Who cares ?*/ }
            }
        }.start(); // Starts now
    
        // Thread that reads std err and feeds the writer given in input
        new Thread() {
            @Override public void run() {
                String line;
                try {
                    while ((line = stdErr.readLine()) != null) {
                        err.write(line + newline);
                    }
                } catch (Exception e) {throw new Error(e);}
                try {
                    err.flush();
                    err.close();
                } catch (IOException e) { /* Who cares ?*/ }
            }
        }.start(); // Starts now
    
        // Thread that reads the std in given in input and that feeds the input of the process
        new Thread() {
            @Override public void run() {
                String line;
                try {
                    while ((line = in.readLine()) != null) {
                        stdIn.write(line + newline);
                    }
                } catch (Exception e) {throw new Error(e);}
    
                try {
                    stdIn.flush();
                    stdIn.close();
                } catch (IOException e) { /* Who cares ?*/ }
            }
        }.start(); // Starts now
    
        // Wait until the end of the process
        try {
             process.waitFor();
        } catch (Exception e) {
            throw new Error(e);
        }
    
    } // End of #communicate
    

    I hope this helps.

    0 讨论(0)
提交回复
热议问题