BufferedReader problem

0

witam mam problem piszę program który ma za zadanie wysyłać zapytania do innego programu wykonalnego, a ten będzie odpowiadał, jednak mam problem i nie do końca wiem jak go rozwiązać
załóżmy że mamy program echo.exe który przepisuje komendy

poniżej kod:

  public static void main(String[] args) throws IOException {
        
    String line;
    OutputStream stdin = null;
    InputStream stderr = null;
    InputStream stdout = null;

      Process process = Runtime.getRuntime ().exec ("./echo.exe");
      stdin = process.getOutputStream ();
      stderr = process.getErrorStream ();
      stdout = process.getInputStream ();

      // "write" the parms into stdin
      line = "echo COS1" + "\n";
      stdin.write(line.getBytes() );
      stdin.flush();

      line = "echo COS" + "\n";
      stdin.write(line.getBytes() );
      stdin.flush();

      line = "echo COSIK" + "\n";
      stdin.write(line.getBytes() );
      stdin.flush();

      stdin.close();

      // clean up if any output in stdout
      BufferedReader brCleanUp =
        new BufferedReader (new InputStreamReader (stdout));
      while ((line = brCleanUp.readLine ()) != null) {
        System.out.println ("[Stdout] " + line);
      }
      brCleanUp.close();

   System.out.println ("DZIEKUJE" );

    }

jako wynik otrzymuję:

[Stdout] echo COS1
[Stdout] 
[Stdout] echo COS
[Stdout] 
[Stdout] echo COSIK
[Stdout] 
[Stdout] # echo COS1
[Stdout] 
[Stdout] COS1
[Stdout] 
[Stdout] # echo COS
[Stdout] 
[Stdout] COS
[Stdout] 
[Stdout] # echo COSIK
[Stdout] 
[Stdout] COSIK
[Stdout] 

chciałbym żeby po wykonaniu poleceń wyświetliło się "DZIEKUJE"
jednak brCleanUp.readLine () czeka prawdopodobnie na nowe linie wyniku
czy ktoś ma może pomysł jak to zrealizować?

PS. problem został uproszczony tak aby łatwo było zrozumieć o co mi chodzi ;) program jest pewną częścią innego złożonego projektu nad którym pracuję, więc będę wdzięczny za pomoc.

0

To jest troche dziwne ;p

    OutputStream stdin = null;
    InputStream stderr = null;
    InputStream stdout = null;

Czy lubisz sobie utrudniac zycie celowo zmieniajac nazwy na mowiace o czyms, co jest nieprawda ?

0
[losowa nazwa] napisał(a)

To jest troche dziwne ;p

    OutputStream stdin = null;
    InputStream stderr = null;
    InputStream stdout = null;

Czy lubisz sobie utrudniac zycie celowo zmieniajac nazwy na mowiace o czyms, co jest nieprawda ?

piszemy do stdin stąd ta nazwa
jest to na razie prawie wierny przykład z tego:
http://www.rgagnon.com/javadetails/java-0014.html

jednak zależy mi aby po wyświetleniu wyników nie czekał dłużej na kolejne linie bo już i tak nic tam nie przyjdzie, a chciałbym potem dalej coś robić dla przykładu dałem wyświetlenie "DZIEKUJE"

ma ktoś jakiś pomysł?

0
donkey napisał(a)

http://www.velocityreviews.com/forums/t133506-process-does-not-receive-eof-when-reading-from-process-getoutputstream.html tu coś pisze o podobnym problemie

dziękuję temat zgodny z moim problemem, ale niestety nie pomógł, jednak zawsze coś przybliżył :)

chyba w końcu poradziłem sobie z problemem gdyż na razie działa tak jak chciałem
wklejam kod gdyby ktoś w przyszłości potrzebował :)

      BufferedReader brCleanUp =
        new BufferedReader (new InputStreamReader (stdout));
      line = brCleanUp.readLine ();
      while (line  != null) {
        System.out.println ("[Stdout] " + line);
        line=null;
        if (brCleanUp.ready())line = brCleanUp.readLine();
       // System.out.println("[LINE] *"+line+ "*");
      }
      brCleanUp.close();
0

http://download.oracle.com/javase/7/docs/api/java/io/Reader.html#ready()

ready() sprawdza tylko czy coś jest w buforze. Nie sprawdza końca strumienia - notabene koniec strumienia spowodowałby zwrócenie nulla w readLine(). Jeśli odpalony proces będzie pisał na swój stdout wolniej niż ty będziesz go odpytywał to twój program się przedwcześnie zakończy.

0
donki7 napisał(a)

http://download.oracle.com/javase/7/docs/api/java/io/Reader.html#ready()

ready() sprawdza tylko czy coś jest w buforze. Nie sprawdza końca strumienia - notabene koniec strumienia spowodowałby zwrócenie nulla w readLine(). Jeśli odpalony proces będzie pisał na swój stdout wolniej niż ty będziesz go odpytywał to twój program się przedwcześnie zakończy.

możliwe :/ na razie metoda się spisuje jednak rzeczywiście masz rację przydałoby się coś bardziej eleganckiego i pewnego

edit: rzeczywiście przy bardziej skomplikowanych poleceniach niż echo (które jest szybkie w wykonaniu)
program zakańcza działanie przedwcześnie, także moje rozwiązanie okazuje się słabe

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