Обрабатывать ввод с помощью StreamGobbler

Я был через StreamGobbler по следующему URL

JavaWorld: Stream Gobbler

Я понимаю использование и причину, по которой это было реализовано. Однако рассматриваются только те сценарии, в которых может быть вывод ошибок команды / обработки.

Я не нахожу никакого сценария, в котором StreamGobbler используется для обработки входных данных. Например, в mailx Я должен указать тело письма, которое я сделал в следующем формате

Process proc = Runtime.getRuntime().exec(cmd);
OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream());
osw.write(mailBody);
osw.close();

Как это может быть обработано через StreamGobbler, или это не требуется обрабатывать через него.

1 ответ

Решение

В идеале вы должны использовать StreamGobbler на вашем потоке ошибок (в отдельном потоке), если вы уже ожидаете что-то на InputStream, чтобы посмотреть, когда process.waitFor() возвращает ненулевое значение, чтобы узнать сообщение об ошибке. Если вы не заинтересованы в InputStreamзатем вы можете прочитать ErrorStream непосредственно в своем коде, как только вы закончите с вводом своих данных для команды.

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());
}
Другие вопросы по тегам