Komunikacja z zewnętrznym programem

0

Witam,
mam następujący problem.

Załóżmy, że piszemy prosty program jako frontend do zewnętrznej aplikacji konsolowej w systemie linux.
W klasie przechowujemy wskazanie na process
Process p=Runtime.getRuntime().exec("external_ap");
Jak również jego wejście/wyjście

stdInput=new BufferedReader(new InputStreamReader(p.getInputStream()));
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
stdOutput=new DataOutputStream(p.getOutputStream());

Chcemy wyświetlić wszystko, co wyrzuca zewnętrzna aplikacja:

while((line=stdInput.readLine())!=null){
System.out.println(line);
}

Wszystko na razie gra. Mój problem pojawia się, gdy w procesie zewnętrznym pojawia się dialog z użytkownikiem, niech będzie to oczekiwanie na liczbę. Wtedy aplikacja zawiesza się w pętli.
Szukam wskazówki, jak można obsłużyć to tak, żeby dialog z użytkownikiem przenieść na własną aplikację. Czyli, jeśli pojawi się oczekiwanie na dane wprowadzone przez użytkownika, program wychodzi z pętli i obsługuje zdarzenie.

Za wszelkie uwagi - serdecznie dziękuję :)

0

Moim zdaniem rozwiązaniem tego problemu jest interaktywne parsowanie wyjścia programu zewnętrznego po to, żeby móc na wejście tego procesu podać oczekiwane przez niego dane. Zadziała to oczywiście jeżeli wejście i wyjście jest buforowane wierszowo lub znakowo (dynamicznie), a nie zadziała jeżeli przekierowanie jest zrealizowane za pomocą plików tymczasowych (czyli buforowania obejmującego całość wejścia i całość wyjścia).
Głównym problemem jest rozpoznanie oczekiwania na wejście - czyli rozpoznania pytania procesu zewnętrznego. Jeżeli zachęty do wprowadzenia danych kończą się zawsze dwukropkiem, albo znakiem pytajnika i nie ma ich w żadnych innych tekstach wyjściowych tego procesu, to sprawa jest dość oczywista. Należy wtedy wyrzucić własne zapytanie ze sparsowanym z wyjścia tego procesu tekstem, wczytać ciąg znaków i podać na wejście procesu zewnętrznego. Jeżeli dane będą złe, to proces ten zapewne o tym poinformuje, co również należy sparsować, przekazać do własnego dialogu do użytkownika i ponowić wczytywanie danych w ten sam sposób.
Im bardziej rozbudowana jest interakcja procesu zewnętrznego, tym trudniej będzie to wykonać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1