This is in response to the tip Execute a Process Without a Hang. When I need to stdin, stdout and stderr at the same time, I use different threads to handle them.Here’s the code:
final Process p = Runtime.getRuntime().exec("/usr/bin/abc"); Thread perr = new Thread() { public void run() { BufferedReader din = new BufferedReader(new InputStreamReader(p.getErrorStream())); String s; try { while ( (s = din.readLine()) != null ) { System.err.println("err stream: "+s); } din.close(); } catch (IOException e ) { } } }; final Writer jspOut = out; Thread pout = new Thread() { public void run() { BufferedReader din = new BufferedReader(new InputStreamReader(p.getInputStream())); String s; try { while ( (s = din.readLine()) != null ) { jspOut.write(s); jspOut.write("
"); jspOut.flush(); } din.close(); } catch (IOException e ) { } } }; perr.start(); pout.start(); final BufferedReader urlBR = new BufferedReader(new InputStreamReader(new URL(url).openStream())); final Writer pWriter = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); String line = ""; while((line = urlBR.readLine()) != null) { pWriter.write(line); pWriter.write("
"); pWriter.flush(); } urlBR.close(); pWriter.close(); p.waitFor();