Обработвайте въвеждането с помощта на 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. Но като failsafe трябва ли да го включа? Също така по отношение на пощенското тяло, което споменах по-горе, това не би било част от StreamGobbler, нали? - person Vivek; 04.09.2012
comment
Не като защита срещу отказ, а за да сте информирани за грешки, ако има такива, винаги трябва да четете потока от грешки. Както казахте, inputstream не е задължителен, ако не очаквате изход от вашата команда. Не, тялото на пощата е вашият принос към процеса. - person Vikdor; 04.09.2012
comment
Все още съм объркан. Моята команда изглежда така mailx -s mymail mailsubject mailtoaddress, така че когато я изпълня и няма да очаквам нищо във входния поток. Така че пощенското тяло няма нищо общо със 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