InputStreamReader friert ein

Status
Nicht offen für weitere Antworten.

JavaTom

Mitglied
Ich hab folgendes Problem, manchmal friert diese Funktion ein. Ich vermute mal, dass der Reader auf weiteren Input wartet.
Zum besseren Verständnis:
Dieses Funktion ist teil eines Programmes welches ein Programm (prozess=Runtime.getRuntime.exec(...)), dieser übergibt dann den InputStream an diese Funktion (inputSt(a.getInputStream,a.getErrorStream).
Irgendwelche Lösungsvorschläge?
Code:
     private String inputSt(InputStream ins,InputStream err) throws IOException{
    	
    	BufferedReader reader2=new BufferedReader(new InputStreamReader(err));
    	BufferedReader reader=new BufferedReader(new InputStreamReader(ins));
    	String line;
    	if ((line=reader2.readLine())!=null) {
    		String errS;
    		System.out.println(line);
    		errS=line;
	    	while((line=reader2.readLine()) != null){  //HIER einfrieren bei .readLine()
	    		
	    		System.out.println(line);
	    		errS+=line;
	    	}
	    	return errS;
    	}
    	else {
    		String resp=null;
    		resp=reader.readLine();
    		System.out.println(resp);
	    	while((line=reader.readLine()) != null){
	    		System.out.println(line);
	    		resp+=line;
	    		
	    	}
	    	return resp;
    	}
    	
   }
    	}
    }
    	System.out.println(resp);
    	
   }
 

The_S

Top Contributor
Ja klar, wenn das Programm keine "line" mehr zurückgibt, aber dennoch weiter läuft, dann wartet er hier natürlich, bis wieder was zurück kommt. Ganz normales verhalten ...
 

JavaTom

Mitglied
Das Problem tritt aber nur sporatisch auf. 10 klappt es und das 11 bleibt es hängen.
Ich hab mir schon überlegt ein Timeout einzubauen (zweiten Thread mit Timer aufmachen).
Ist aber keine "schöne" Lösung.
 

The_S

Top Contributor
was gibt denn das Programm immer zurück? Sicher, dass es immer eine komplette Zeile zurückgibt?
 

DocRandom

Top Contributor
..was mir bei Deinem Code ins Auge sticht, ist, das Du 2 mal die selben Anweisungen im If-else-Block hast.
Daher meine frage ich mich warum Du das ganze nicht gleich mit einen SequenceInputStream erledigst?

lg
DocRandom
 

JavaTom

Mitglied
Ist war schon etwas länger her, will aber niemand die Lösung vorenthalten:

Code:
...(){
			InputSt inputst;
			Thread thread=new Thread(inputst=new InputSt(a.getInputStream(),a.getErrorStream()));
			thread.start();
			thread.join(60000);
			out=inputst.st;

}


class InputSt extends Thread{
	private InputStream ins;
	private InputStream err;
	String st;
	public InputSt(InputStream ins1,InputStream err1){
		ins=ins1;
		err=err1;
	}
	public void run(){
    	InputStreamReader reader2=new InputStreamReader(err);
    	InputStreamReader reader=new InputStreamReader(ins);
    	try{
    	Thread.sleep(2000);
    	}
    	catch (InterruptedException ine){}
    	try{
    	st=new String();
    	if (reader2.ready()==true){
    	int len=reader2.read();
    	st=new String();
    	if (len>0){
    	char [] str=new char[len];
    		while(len>0){
 
    		len=reader2.read(str);
    		st+=new String(str);
    		}
	}
    	}
	
	if(reader.ready()==true){
	int len=reader.read();
	if(len >0) {
		char [] str=new char[len];
		while(len>0){

    		len=reader.read(str);
    		st+=new String(str);
    		}
	}
	}
	reader.close();
	reader2.close();
    }
    	catch (IOException ieo){}
	
}
}
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben