# readLine() von BufferedReader hält das Programm fest/auf!



## Novanic (18. Mai 2006)

Hi Leute,

ich hab hier ein ganz merkwürdiges Problem.
Ich habe eine Klasse die Befehle/Programme ausführt und die Rückgabewerte in einen BufferedReader steckt.
Wenn ich z.B. "help" oder "java" ausführen lasse, kann mein Programm schön die Ausgaben in eine Collection packen (liest vom BufferedReader mit "readLine()").
Wenn ich jetzt aber "javac" ausführe, bleibt mein Programm einfach stehen und zwar genau an der Stelle von dem Aufruf von "readLine()".

Ich hab testweise mal etwas probiert, um es zu beweisen ("in" ist der BufferedReader):


```
System.out.println("Test1");
in.readLine();
System.out.println("Test2");
```

Es wird "Test1" ausgegeben, aber "Test2" wird nie ausgegeben. Wenn ich z.B. "help" oder "java" ausführe, läuft das wunderbar. Wenn ich die drei Befehle manuell auf der Konsole teste, kommt auch überall Text zurück.

Mit dem Debugger kann ich auch nicht in die in "readLine()" reinspringen, hängt sich da auch auf... Wodran kann das denn liegen, dass der BufferedReader sich da einfach gnadenlos aufhängt?

Vielen Dank im Voraus! 

Gruß Nova


----------



## madboy (18. Mai 2006)

Hi Novanic,

Meines Wissens blockiert readLine() so lange, bis eine Zeile eingelesen worden ist (also mit \n oder \r abgeschlossen). Wenn Du ein Programm ausführst, das weder \n noch \r zurückgibt, blockiert Dein readLine() ewig.

Gruß,
madboy


----------



## Novanic (18. Mai 2006)

Hm, und hast du auch eine Idee wie man sonst an den output kommen könnte? 

Danke für die Antwort. 

Gruß Nova


----------



## lhein (18. Mai 2006)

Ich würde mal vermuten:

read Methode benutzen und selber für Zeilenumbrüche sorgen

Dann bist nicht auf den externen Linebreak angewiesen.

lr


----------



## Novanic (18. Mai 2006)

Hm, also bei der read()-Methode hängt er sich genauso auf. Hättest du vielleicht einen Lösungsansatz für deine Idee? 

Danke. 

Gruß Nova


----------



## lhein (18. Mai 2006)

Hab sowas noch nie programmiert, daher kann ich adhoc nix vorschlagen.

Müsste ich erst selber mit experimentieren...aber heut abend sicher nimmer.

lr


----------



## PELLE (18. Mai 2006)

yo den LR hab ich ganz schön mitgenommen;-)


----------



## norman (19. Mai 2006)

dein oben geposteter block steht sicherlich in einem try-catch-block, oder? vermutlich wird der bei in.readLine wg einem fehler abgebrochen. 
kannst du nicht die ganze methode posten?


----------



## tomcat (19. Mai 2006)

Hallo Zusammen,

es freut mich zu hören, das nicht nur ich das Problem habe, ich wollt mich nämlich gerade mal dransetzen um einen Post dazu zu schreiben. 

also ich kann die Erfahrung vom  Novanic bestätigen, ich bastel mir auch aus einem Config File eine Programmaufrauf einer exe zusammen, der auch so korrekt ist und innerhalb eines Eingabefensters ausgeführt wird. Sobald ich das Programm allerdings über Java starten will (jeweils mit readline() und read() versucht) bleib er nach einer zeile stecken obwohl definitiv noch 3 kommen müßten.

ich hab auch spaßeshalber mal versucht, über den 


```
pr.getErrorStream().read()
```

zu lesen, falls er die folgenden Ausgaben nur noch über den Stderr schreibt. Hat aber auch nix weiter geholfen.

Ich wäre daher auch sehr an einer Lösung dieses Problems interessiert....   ???:L 

Danke schon mal und hoffentlich fällt jemanden was dazu ein.

Schöne Grüße

tomcat


----------



## tomcat (19. Mai 2006)

```
procout = new BufferedReader(new InputStreamReader(pr.getInputStream())); //wobei pr ein prozess ist 
try{
   while((line = procout.readLine()) != null){
	System.out.println("Ausgabe: " + line);
   }
}catch(IOException e){
    System.out.println("Es ist eine IOException beim Auslesen der Prozessausgaben aufgetreten: "+ e.toString());
}
```

also ich hab mal mein Beispiel genommen, ich vermute das wird auch das Grundprinzip verdeutlichen. 
Die IOException wird bei einem Fehler geworfen, aber Sie wird bei mir nie ausgegeben, von daher ist ein Fehler vermutlich auch recht unwahrscheinlich ?!?

Gruß

tomcat


----------



## Novanic (20. Mai 2006)

Also ich hab immernoch keine Lösung für das Problem gefunden. :-(

Ich hoffe hier kann jemand helfen,  ich geb euch hier mal einen Codeausschnitt. Wenn man als myCommand (Befehl als String) z.B. "help" oder "java" angibt, bekommt man alle Zeilen zurück. Gibt man aber "javac" ein, friert alles an der Zeile "in.readLine()" ein.
Hat jemand eine Idee wie sich das so umbauen lässt, dass es auch bei "javac" funktionieren würde (wenn Zeilen nicht mit "\r\n" beendet wurden)?


```
private BufferedReader getProcessReader() throws IOException
    {
        Runtime theRuntime = Runtime.getRuntime();
        Process theProcess = theRuntime.exec(myCommand);

        InputStream theInputStream = theProcess.getInputStream();

        return new BufferedReader(new InputStreamReader(theInputStream));
    }

    public Collection getInputCollection()
    {
        Collection theData = new ArrayList();
        String str;

        try {
            BufferedReader in = getProcessReader();

            while((str = in.readLine()) != null)
            {
                theData.add(str.trim());
            }
        } catch(IOException e) {
            System.out.println("Fehler beim Lesen des InputStreams.");
        }

        try {
            aProcess.waitFor();
        } catch (InterruptedException e) {
            System.out.println("Es ist eine InterruptException aufgetreten ...");
        }

        return theData;
    }
```

Vielen Dank schonmal! 

Gruß Nova


----------

