Handle Input using StreamGobbler

java, outputstream, runtime.exec

Solution

Ideally, you would employ the `StreamGobbler` on your error stream (in a separate thread) if you are already expecting something on `InputStream`, to look into when the `process.waitFor()` returns a non-zero value to find out the error message. If you are not interested in the `InputStream`, then you can read the ErrorStream directly in your code, once you are done with giving your inputs to the command.

Process proc = Runtime.getRuntime().exec(cmd)
// Start a stream gobbler to read the error stream.
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
errorGobbler.start();

OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream())
osw.write(mailBody)
osw.close();

int exitStatus = proc.waitFor();
if (0 != exitStatus) {
    /*
     * If you had not used a StreamGobbler to read the errorStream, you wouldn't have
     * had a chance to know what went wrong with this command execution.
     */
    LOG.warn("Error while sending email: " + errorGobbler.getContent());
}

Problem

I have been through the `StreamGobbler` and I understand the usage and the reason on why it has been implemented. However the scenarios covered are only those wherein there could be an output from the command / handling errors. I do not find any scenario wherein `StreamGobbler` is used to handle inputs. For example, in `mailx` , I have to specify the body of the email, which I have done in the following format ``` Process proc = Runtime.getRuntime().exec(cmd); OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream()); osw.write(mailBody); osw.close(); ``` How can this be handled through `StreamGobbler`, or it is not required to be handled through it?

Original source