PDA

View Full Version : [Java] redirigere l'output


cionci
10-05-2007, 12:12
Da un'applicazione Swing devo prendere lo standard output dell'applicazione stessa e visualizzarlo.
Come posso fare ?

spv42
10-05-2007, 12:40
System.setOut(new PrintPane(System.out))

dove PrintPane è una tua classe che estende PrintStream.

RaouL_BennetH
10-05-2007, 12:41
non so se può esserti utile questo link:

http://www.rgagnon.com/javadetails/java-0435.html

andbin
10-05-2007, 13:59
Da un'applicazione Swing devo prendere lo standard output dell'applicazione stessa e visualizzarlo.
Come posso fare ?Possibile lo è .... con qualche problemino.

Supponiamo che si voglia mandare lo standard output (o error) su una JTextArea. La prima cosa che mi viene in mente è fare una classe che estende PrintStream così:
import java.io.*;
import javax.swing.*;

public class JTextAreaPrintStream extends PrintStream
{
public JTextAreaPrintStream (JTextArea textArea)
throws UnsupportedEncodingException
{
super (new DummyOutputStream (textArea), true, "ISO-8859-1");
}

private static class DummyOutputStream extends OutputStream
{
private JTextArea textArea;

public DummyOutputStream (JTextArea textArea)
{
this.textArea = textArea;
}

public void write (int b)
{
textArea.append (String.valueOf ((char) b));
}
}
}Si crea una istanza di JTextAreaPrintStream passando il reference ad un JTextArea, quindi si imposta il nuovo standard output/error con System.setOut (o setErr).

Ci sono dei problemini:
- Dovendo usare un OutputStream, posso trattare solo dei byte, non caratteri. Nel codice sopra creo il PrintStream con charset ISO-8859-1 e nel DummyOutputStream ottengo un carattere direttamente dal byte.
- C'è la questione del "caret" della JTextArea, sarebbe meglio spostarlo ad ogni inserimento. Come farlo nel modo migliore è da valutare.

Con un po' di "sbattimento" questi problemini si potrebbero credo risolvere. Per la questione del charset si potrebbe creare il PrintStream con un charset tipo UTF-16LE e quindi nel DummyOutputStream posso sapere con certezza che un carattere è formato da 2 byte e quind ricostruire il carattere.

PGI-Bis
10-05-2007, 15:07
Puoi usare una Pipe (java.nio.channels) e uno scanner.

Colleghi l'entrata a System.out e System.err e l'uscita ad uno Scanner. Affidi lo Scanner ad un Thread (demone) e gli fai leggere le linee in uscita. Quelle linee le accodi ad un Document e sei a posto. Ricorda di usare l'EDT per modificare il contenuto del documento di testo.

cionci
10-05-2007, 15:16
Comunque in questo modo catturo proprio lo standard output o solo lo stream System.out...mi spiego: nel mio programma ho una JNI, alcuni metodi di questa fanno l'output sullo stdout, quindi suppongo che non usino Java, ma il sistema nativo per fare l'output... Comunque ora provo...

spv42
10-05-2007, 15:19
Puoi usare una Pipe (java.nio.channels) e uno scanner.

Colleghi l'entrata a System.out e System.err e l'uscita ad uno Scanner. Affidi lo Scanner ad un Thread (demone) e gli fai leggere le linee in uscita. Quelle linee le accodi ad un Document e sei a posto. Ricorda di usare l'EDT per modificare il contenuto del documento di testo.

Scusate se mi intrometto!
Ma cosa significa EDT?

Grazie!

PGI-Bis
10-05-2007, 15:22
Event Dispatcher Thread.

x cionci: redirigi l'output del processo java.exe (o javaw.exe), jni inclusi.