Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Java перехватить поток вывода exe-шника / 3 сообщений из 3, страница 1 из 1
21.02.2006, 12:10
    #33557929
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из Java перехватить поток вывода exe-шника
Продолжение вчерашнего бреда: есть некий комплекс, состоящий из БД, Томката и веб-приложения внутри него. Эта штука должна запускаться по нажатию одной кнопки. Т.е. из некоего "Стартера". Пока-что стартер был написан на Delphi, но мы столкнулись с тем, что при перехвате вывода в консоль при помощи named pipes приложение блокируется до того момента, пока из трубы не зачитывается информация. Т.е. как только мы сделали System.out - все встает до того момента, как мы прочитаем из трубы информацию. Вариант читать из трубы по таймеру не прошел из-за того, что слишком большая нагрузка. Анализировать вывод надо.

Подумав, я написал следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
            PipedOutputStream pos =  new  PipedOutputStream();
            PipedInputStream pis =  new  PipedInputStream(pos);
            PrintStream prstr =  new  PrintStream(pos);
            System.setOut(prstr);
            Runtime.getRuntime().exec("subst.exe /?");

            System.err.println("available: "+pis.available());

Не сработало, хотя в принципе, я не ждал, что все будет так легко.

Вопрос: кто-нибудь знает, как сделать такую вещь правильно? И можно ли?
...
Рейтинг: 0 / 0
21.02.2006, 13:19
    #33558179
knu
knu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из Java перехватить поток вывода exe-шника
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
 class  PipeThread  implements  Runnable {

    InputStream m_in;
    OutputStream m_out;
    PipeThread(InputStream in, OutputStream out) {
         super ();
        m_in = in;
        m_out = out;
    }
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p/>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see Thread#run()
     */
     public   void  run() {
         int  c;
         try  {
             while  ( (c = m_in.read()) >  0 ) {
                m_out.write(c);
            }
            m_out.flush();
            m_out.close();
        }  catch  (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * @author knu
 */
 public   class  MyRuntime {

     public  InputStream exec2stream( final  String cmd)  throws  MyException {
        PipedInputStream result =  new  PipedInputStream();
        java.lang.Runtime rt;
        Process proc;
        ByteArrayOutputStream err =  new  ByteArrayOutputStream();
         try  {
            PipedOutputStream out =  new  PipedOutputStream(result);
            rt = Runtime.getRuntime();
            proc = rt.exec(cmd);
            Thread tin =  new  Thread(
                 new  PipeThread(proc.getInputStream(), out)
            );
            Thread terr =  new  Thread(
                 new  PipeThread(proc.getErrorStream(), err)
            );
            tin.start();
            terr.start();
//            proc.waitFor();
        }  catch  (Throwable t) {
             throw   new  MyException(t.toString());
        }
         if  (err.size() >  0 ) {
             throw   new  MyException( new  String(err.toByteArray()));
        }
         return  result;
    }

     public   void  exec( final  String cmd)  throws  MyException {
        InputStream in = exec2stream(cmd);
         try  {
             int  c =  0 ;
             while  ( (c = in.read()) >  0 ) { /*something*/ };
        }  catch  (Throwable t) {
             throw   new  MyException(t.toString());
        }  finally  {
             try  {
                in.close();
            }  catch  (IOException e) {
                 throw   new  MyException(e);
            }
        }
    }
}
Вот реализовывал как-то. Может пригодится.
...
Рейтинг: 0 / 0
21.02.2006, 13:26
    #33558201
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из Java перехватить поток вывода exe-шника
Спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Java перехватить поток вывода exe-шника / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]