powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Java перехватить поток вывода exe-шника
3 сообщений из 3, страница 1 из 1
Как из Java перехватить поток вывода exe-шника
    #33557929
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжение вчерашнего бреда: есть некий комплекс, состоящий из БД, Томката и веб-приложения внутри него. Эта штука должна запускаться по нажатию одной кнопки. Т.е. из некоего "Стартера". Пока-что стартер был написан на 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
Как из Java перехватить поток вывода exe-шника
    #33558179
knu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
knu
Гость
Код: 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
Как из Java перехватить поток вывода exe-шника
    #33558201
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как из Java перехватить поток вывода exe-шника
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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