Обработка ввода с помощью 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, или это не обязательно.


person Vivek    schedule 04.09.2012    source источник


Ответы (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());
}
person Vikdor    schedule 04.09.2012
comment
Поэтому в данном случае меня не интересует InputStream для команды mailx. Но в качестве отказоустойчивого я должен его включить? Также что касается почтового ящика, о котором я упоминал выше, это не будет частью StreamGobbler, верно? - person Vivek; 04.09.2012
comment
Не в качестве средства защиты от сбоев, а для того, чтобы получать информацию об ошибках, если таковые имеются, вы всегда должны читать поток ошибок. Как вы сказали, поток ввода необязателен, если вы не ожидаете вывода от своей команды. Нет, тело письма - это ваш вклад в процесс. - person Vikdor; 04.09.2012
comment
Я все еще в замешательстве. Моя команда выглядит так mailx -s mymail mailsubject mailtoaddress, поэтому, когда я выполняю ее и ничего не ожидаю во входном потоке. Таким образом, mailbody не имеет ничего общего с StreamGobbler, и его нужно передавать ему. Правильно ли я понимаю, пожалуйста, поправьте меня, если я ошибаюсь - person Vivek; 04.09.2012
comment
Хорошо, все, что вам нужно передать StreamGobbler, - это proc.getOutputStream(). пожалуйста, посмотрите правку, чтобы узнать, как я буду его использовать. - person Vikdor; 04.09.2012
comment
В приведенном выше редактировании требуется передать proc.getOutputStream () в StreamGobbler. Что-то вроде этого StreamGobbler StreamGobbler outputGobbler = new StreamGobbler(proc.getOutputStream()); outputGobbler.start(); - person Vivek; 04.09.2012
comment
Нет, не нужно. На самом деле не должно, поскольку StreamGobbler предназначен для входных потоков (ввод / ошибка). - person Vikdor; 04.09.2012
comment
Большое спасибо @Vikdor Это действительно прояснило мою концепцию StreamGobbler. Надеюсь, это обсуждение также поможет другим. - person Vivek; 04.09.2012