Problem beim lesen des InputStreams von einem Subprozess

halim

Mitglied
Servus java-forum,

bin neu hier und hoffe, dass ich hier richtig gepostet habe. Wenn nicht, bitte in richtigen Bereich verschieben.

Zu meinem Problem:
Ich habe ein Java Programm geschrieben, dass ein Subprozess startet und in einem Thread die Ausgabe davon lesen soll. Mit Hilfe von Google habe ich alles nötige zu diesem Thema gefunden, leider funktioniert das mit manchen Prozessen nicht richtig.

Ich verwende Ubuntu und arbeite mit NetBeans. Mit manchen Programmen klappt es, mit anderen wiederum nicht. "glxgears" ist ein Programm mit dem es nicht richtig funktioniert, hier der Source Code:
Die Main Klasse mit der main(..) Methode:
Java:
package outputreader;

public class Main{
    public static void main(String[] args){
        Process p = null;
        try{
            String[] cmd = {"/bin/sh", "-c", "glxgears"};
            p = Runtime.getRuntime().exec(cmd);//hier habe ich auch versucht direkt "glxgears" zu schreiben, liefert aber das gleiche Ergebnis
        }catch(Exception ex){
            System.out.println("Can't create process");
        }
        Thread stdout = new OutputReader(p.getInputStream());
        stdout.start();
        
        Thread stderr = new OutputReader(p.getErrorStream());
        stderr.start();
    }
}
Der Thread, der die Ausgabe lesen soll:
Java:
package outputreader;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

class OutputReader extends Thread{
    private BufferedReader br;
    private InputStream is;
    
    OutputReader(InputStream is){
        this.is = is;
        this.br = new BufferedReader(new InputStreamReader(is));
    }
    
    @Override
    public void run(){
        while(true){
            String s;
            int i;
            try {
                while((i = is.read()) != -1){
                    System.out.print((char) i);
                }
            } catch (IOException ex) {
                System.out.println("InputStream.read() exception, e: "+ex.getMessage());
            }
            
                        
            //---------------
            /*
            try{
                while((s = br.readLine()) != null){
                    System.out.println("Zeile: "+s);
                }
            }catch(IOException ex){
                System.out.println("BufferedReader.readLine() exception, e: "+ex.getMessage());
            }*/

        }
    }
    
}

Wie ihr in der run() Methode des Threads sieht, habe ich auf 2 verschiedene Arten versucht den InputStream auszulesen.
1. direkt über den InputStream mit der read() Methode, Zeichen für Zeichen auslesen.
2. mit einem BufferedReader eine Zeile als String auslesen.

Beide Vorgehensweisen liefern exakt die gleichen Ergebnisse:
glxgears, das Programm, wird gestartet. Aber ich bekomme keine Ausgabe.
Erst wenn ich das Programm per klick auf "X" schließe, wird mir alles in die Konsole geschrieben. Während glxgears läuft, passiert nichts.

glxgears terminiert die ausgegebenen Zeilen mit "\n". Hier der Beweis:
Code:
printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds, fps);

Oder hier nachzulesen: http://cvsweb.xfree86.org/cvsweb/xc/programs/glxgears/glxgears.c?rev=1.3

Ich habe für Testzwecke auch ein eigenes Java Programm gechrieben, dass ein mal in der Sekunde was in die Konsole ausgibt und den mit Hilfe des obigen Programms gestartet. Da hat es Wunderbar geklappt, alle Ausgaben konnten gelesen werden.

Hier der Source Code zum Testprogramm:
Java:
public class main{
    public static void main(String args[]){
        Thread t = new DoSomeOutput();
        t.start();
    }
}
//Thread:
class DoSomeOutput extends Thread{

    @Override
    public void run(){
        int i = 0;
        while(true){
            try{
                System.out.println("Zähler: "+(i++));
                Thread.sleep(1000);
            }catch(InterruptedException ex){
                System.out.println("Kann nicht schlafen :(");
            }
        }
    }  
}

Ich hoffe, dass ich alles notwendige erwähnt habe und ihr mir helfen könnt.


MfG

Halim
 
N

nillehammer

Gast
Hallo halim,

das Phänomen erklären kann ich. Ich habe aber leider keine Lösung.

Der "Bösewicht" versteckt sich im Quellcode des glxgears und Zwar in dieser Zeile:
#include <stdio.h>

Die stdio Bibliothek arbeitet mit Puffern. Wenn stdout/stderr mit einer Shell verbunden sind, merkt die stdio das und flusht den Puffer bei jedem Auftreten eines Linefeed.

Aber, wenn stdout/stderr mit einer Pipe verbunden sind (und das sind sie bei Aufruf durch Java) dann wird der Puffer nicht bei Auftreten eines Linefeed geflusht, sondern erst, wenn er voll ist oder, wenn der Prozess beendet wird.
 

halim

Mitglied
Danke für die schnelle Antwort! Ich verstehe das mit dem flushen der Puffer nicht ganz. Meine C/C++ Kentnisse sind nicht allzu gut.

Von Java aus kann man da nichts machen oder kann man dieses Problem irgendwie seitens der C/C++ Anwendung (z.B. glxgears) umgehen?
 
N

nillehammer

Gast
halim hat gesagt.:
Meine C/C++ Kentnisse sind nicht allzu gut.
Und meine sind praktisch gleich Null :oops:

halim hat gesagt.:
Von Java aus kann man da nichts machen oder kann man dieses Problem irgendwie seitens der C/C++ Anwendung (z.B. glxgears) umgehen?
Von Java aus kann man da nichts machen. Du hast von Seiten des Empfängers keinen Einfluss darauf, wie der Sender seine Daten versendet. Und den zweiten Teil Deiner Frage kann ich Dir leider nicht wirklich beantworten. In einem Link zu dem Thema (allerdings ganz anderer Zusammenhang): pexpect - Noah.org
schlägt der Autor vor, entweder das entsprechende Programm neu zu kompilieren, um das Pufferungsverhalten zu beeinflussen, oder es über Pseudo-Terminals anzusprechen. Bei beidem muss ich leider passen.
 
Zuletzt bearbeitet von einem Moderator:

halim

Mitglied
Danke vielmals für deine Hilfe. Ich werde vermutlich die Ausgabe des Programms direkt umlenken (prog >> output.txt) und in eine Textdatei schreiben lassen. Von dort wird dann mein Java Programm auslesen.

Dieses Problem über Pseudo Terminals zu lösen würde bedeuten, dass das Programm zu sehr an Platformunabhängigkeit verliert (ich kenne keine alternative unter Windows). Andere Lösungswege fallen mir auch nicht ein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
E Verständnisfrage/Problem beim lesen mit ObjectInputStream Java Basics - Anfänger-Themen 3
W Problem beim lesen aus Arraylist Java Basics - Anfänger-Themen 2
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
A Problem beim Deklarieren von einem BOOLEAN Java Basics - Anfänger-Themen 4
B Gleicher Prozess starten und stoppen (Problem beim Stoppen) Java Basics - Anfänger-Themen 5
DestinatioN Problem beim splitten eines Satzes in Wörter und die Wörter in Buchstaben Java Basics - Anfänger-Themen 2
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
R Problem beim Wochenplan (Datum,Wochentag) Java Basics - Anfänger-Themen 30
D Problem beim umwandeln eines Strings in eine Dzezimalzahl Java Basics - Anfänger-Themen 6
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
L Compiler-Fehler Problem beim Programmieren eines Kalenders (java.lang.ArrayIndexOutOfBoundsException) Java Basics - Anfänger-Themen 2
C Problem beim laden eines BufferedImage Java Basics - Anfänger-Themen 2
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
R Problem beim erstellen eines neuen Klassenobjekts Java Basics - Anfänger-Themen 2
F Input/Output Problem beim einlesen eines Strings Java Basics - Anfänger-Themen 3
J Problem beim auslesen von Int Wert aus YML-Datei Java Basics - Anfänger-Themen 6
P Problem beim Abschluss im Kompositum Java Basics - Anfänger-Themen 3
M Problem mit null pinterexception beim laden von Bildern Java Basics - Anfänger-Themen 20
K Problem beim Array aufruf Java Basics - Anfänger-Themen 4
J Problem beim ausführen in cmd.exe Java Basics - Anfänger-Themen 4
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
A Problem beim Compilieren Java Basics - Anfänger-Themen 11
J Problem beim Fenster Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
M Problem beim Compilieren Java Basics - Anfänger-Themen 14
Maxim6394 Problem beim Abspielen von Sounds Java Basics - Anfänger-Themen 8
S Problem beim ersten compilieren überhaubt Java Basics - Anfänger-Themen 43
Luk10 Problem beim .jar Datei erstellen Java Basics - Anfänger-Themen 19
L Problem beim Ausführen Java Basics - Anfänger-Themen 40
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
E Problem beim Programmieren eines Kartenspiels Java Basics - Anfänger-Themen 3
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
M Problem beim compilieren Java Basics - Anfänger-Themen 6
JAVAnnik problem beim lvl laden Java Basics - Anfänger-Themen 15
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
W Problem beim erstellen eines Tests Java Basics - Anfänger-Themen 16
JAVAnnik Problem beim Objekt bewegen Java Basics - Anfänger-Themen 20
A Erstes Programm - Problem beim Ausführen als jar Java Basics - Anfänger-Themen 3
S Problem beim Speichern und Laden von Daten Java Basics - Anfänger-Themen 13
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
S Problem beim Erstellen eines Scanner-Objekts Java Basics - Anfänger-Themen 7
W Problem beim CSV-Import Java Basics - Anfänger-Themen 5
M Datentypen Problem beim zusammenstellen eines Abfrage-Strings Java Basics - Anfänger-Themen 3
K Collections Problem beim import von Packages Java Basics - Anfänger-Themen 10
S Problem beim Kompilieren - cannot find symbol - constructor() Java Basics - Anfänger-Themen 12
B Problem beim Email versenden mit Javamail Java Basics - Anfänger-Themen 5
H Problem beim Anfang von Java (Java Editor) Java Basics - Anfänger-Themen 2
I Problem beim Schreiben eines ersten Programms Java Basics - Anfänger-Themen 3
D Problem beim Zeichnen von "Das Haus vom Nikolaus" Java Basics - Anfänger-Themen 10
D Problem beim Auslesen aus File Java Basics - Anfänger-Themen 3
A Problem beim Splitten eines Strings Java Basics - Anfänger-Themen 10
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
V Problem beim Programm laden Java Basics - Anfänger-Themen 5
H Problem beim kompilieren Java Basics - Anfänger-Themen 3
C ActionListener problem beim starten von programmen Java Basics - Anfänger-Themen 3
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
Miladriel Problem beim Neuzeichnen nach deiconify Java Basics - Anfänger-Themen 9
R Problem beim Ausführen von Java-PGM aus der shel Java Basics - Anfänger-Themen 3
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
M Problem beim Ereignishandling mit Menü Java Basics - Anfänger-Themen 2
H problem beim zeichen im JFrame Java Basics - Anfänger-Themen 6
F Problem beim Objekteaufruf... Java Basics - Anfänger-Themen 4
E BlockChallenge: Problem beim löschen der Blöcke Java Basics - Anfänger-Themen 3
H Problem beim Verkürzen von Programm Java Basics - Anfänger-Themen 3
T Problem beim Werfen und Fangen von Exceptions Java Basics - Anfänger-Themen 2
M Problem beim Zugriff auf Daten GUI + Startklasse Java Basics - Anfänger-Themen 4
P Problem beim Thread Java Basics - Anfänger-Themen 20
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
V Problem beim erstellen eines ausführbaren Programs Java Basics - Anfänger-Themen 5
0 Problem beim Starten des Applets Java Basics - Anfänger-Themen 2
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
G Problem beim Programmieren von Blackjack Java Basics - Anfänger-Themen 15
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
K Problem beim installieren des JDK 1.6+ version Java Basics - Anfänger-Themen 3
T Problem beim Konsolenstart Java Basics - Anfänger-Themen 5
C Problem beim Berechnen der Quadratwurzel Java Basics - Anfänger-Themen 3
C Problem beim nutzen von Teilprogrammen in main Java Basics - Anfänger-Themen 2
M Problem beim Zeichnen Java Basics - Anfänger-Themen 5
D Problem beim Kompilieren Java Basics - Anfänger-Themen 4
D Problem beim auslesen von TextArea Java Basics - Anfänger-Themen 3
G Problem beim Schreiben in Textdatei Java Basics - Anfänger-Themen 9
F ggT finden - problem beim qc Java Basics - Anfänger-Themen 4
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben