Newsgroup: it.comp.java
Titolo: Leggere lo stdout di un eseguibile

Un saluto a tutti.
Vorrei leggere, con una applet in java, l'output di un programma lanciato
utilizzando il comando Runtime.exec() in realtime, ossia un qualche cosa che
di volta in volta legge l'output e mi va ad aggiornare la textArea
dell'applet.
Vi ringrazio anticipatamente
Stefano
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/



 Vorrei leggere l'output di un programma lanciato [...]
E quindi? Qual e' il problema preciso? Non poni nessuna domanda, come ti 
si puo' rispondere?!?
Intanto ti consiglio di considerare che:
1) il metodo exec() di Runtime restituisce un oggetto di tipo Process
2) Process dispone di un metodo getInputStream(), che "Gets the input 
stream of the subprocess. The stream obtains data piped from the 
standard output stream of the process represented by this Process 
object" (basta sfogliare le api).
Buon lavoro.
Saluti
CarMas

Ma sei sicuro di avere i permessi in una applet per lanciare un
eseguibile sul client ?


Ho tutti i permessi per eseguire il programma. Il programma che io lancio mi
restituisce ogni tot secondi delle informazioni sullo stdout. Solo alla fine
della sua esecuzione mi vengono stampati sulla textarea tutte le
informazioni. Vorrei invece stampare nella textarea di volta in volta tutte
le informazioni (run time) e non tutte alla fine del processo. Come posso
fare?


Il metodo di stampa deve far parte di un Thread (o è direttamente il
suo run()). Da dove adesso lanci la stampa, lancerai invece
oggettodeltuoThread.start()


Attualmente io lancio il programma nel seguente modo:
p = Runtime.getRuntime().exec(pluginArgs);
System.out.println("Running the process...");
res = new BufferedReader(new InputStreamReader (p.getInputStream()));
 System.out.println("Reading stdout...");
dopo faccio partire il mio Thread:
runner.start();
aggiungo:
p.waitFor();
p.exitValue();
e nella funzione run del Thread faccio stampare res che dovrebbe contenere
le stringhe dell'output del programma.
Il problema come dicevo è che riesco a leggere tutto alla fine del processo.
E' come se il bufferReader memorizzasse tutte le righe e solo al termine del
programma riesco a leggerle.(Ho provato anche senza bufferReader ma il
risultato è stato lo stesso.)
Grazie per l'aiuto


Forse devi mettere nel run anche l'exec.
Inoltre non bufferizzare, usa (castandolo a char) direttamente il read
di InputStreamReader

 Il problema resta ugualmente... è come se tutto ciò che restituisce il
programma viene messo in memoria e poi viene stampato tutto alla fine!!!
Non riesco a venirne a capo!!


 Non riesco a venirne a capo!!
Prova così:
Process p = Runtime.getRuntime().exec(CMD, null, new File(PATH));	 
ProcessStreamReader psr_stdout =
	new ProcessStreamReader("STDIN", p.getInputStream());
ProcessStreamReader psr_stderr =
	new ProcessStreamReader("STDERR", p.getErrorStream());
psr_stdout.start();
psr_stderr.start();			
int r = p.waitFor();
psr_stdout.join();
psr_stderr.join();
Questa è la classe ProcessStreamReader
public class ProcessStreamReader extends Thread {
	String			name;
	StringBuffer		stream;
	InputStreamReader	in;
	final static int	BUFFER_SIZE	= 256;
	public ProcessStreamReader(String name, InputStream in) {
		super();
 
this.name
 = name;
 
this.in
 = new InputStreamReader(in);
		this.stream = new StringBuffer();
	}
 
	public void run() {
		try {
			int read;
			char[] c = new char[BUFFER_SIZE];
			while ((read=in.read(c,0,BUFFER_SIZE-1)) > 0) {
				stream.append(c, 0, read);
				if (read < BUFFER_SIZE - 1)
					break;
			}
		} catch (IOException io) {}
	}
	public String getString() {
		return stream.toString();
	}
}
Spero ti possa aiutare.
Ciao.