Mar 24

You need to read any output from standard output or standard error when running a process using Runtime.exec(). If you don’t the buffers may fill up causing the process to lock up.

The following code can be used to handle reading the process output, and the linked article provides a lot of great insight into the correct usage of Runtime.exec().

/** code copied from
 *  http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
 *  When Runtime.exec() won't: Navigate yourself around pitfalls
 *  related to the Runtime.exec() method
 *  @author Michael Daconta
 */
import java.util.*;
import java.io.*;

class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    OutputStream os;

    StreamGobbler(InputStream is, String type)
    {
        this(is, type, null);
    }

    StreamGobbler(InputStream is, String type, OutputStream redirect)
    {
        this.is = is;
        this.type = type;
        this.os = redirect;
    }

    /** creates readers to handle the text created by the external program
    */
    public void run()
    {
        try
        {
            PrintWriter pw = null;
            if (os != null)
                pw = new PrintWriter(os);

            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
            {
                if (pw != null)
                    pw.println(line);
                System.out.println(type + ">" + line);
            }
            if (pw != null)
                pw.flush();
        } catch (IOException ioe)
            {
            ioe.printStackTrace();
            }
    }
}

written by objects \\ tags: , , , , , ,

Dec 03

The ImageIO class provides utility classes for both read and writing images. To write your image to an output stream you would can use the write method telling it what format you want to write the image in, eg. JPEG, PNG.

ImageIO.write(image, "PNG", out);

written by objects \\ tags: ,

Oct 19

You need to read all bytes from source stream to the destination. The read() method will return -1 when eof is reached, otherwise it returns the number of bytes read.


public static void copy(InputStream in, OutputStream out
   int bufferSize)
   throws IOException
{
   // Read bytes and write to destination until eof

   byte[] buf = new byte[bufferSize];
   int len = 0;
   while ((len = in.read(buf)) >= 0)
   {
      out.write(buf, 0, len);
   }
}

written by objects \\ tags: , , ,