Essa é uma clase útil para redirecionar um Writer para um TextComponent qualquer.
Mas como vc quer um Stream, veja o post ali debaixo.
public class TextComponentWriter extends Writer {
private StringBuilder buffer = new StringBuilder();
private Thread bufferThread;
private JTextComponent textComponent;
private boolean autoScroll = true;
public TextComponentWriter(JTextComponent textComponent) {
this.textComponent = textComponent;
Runnable r = new Runnable() {
public void run() {
try {
while (!Thread.interrupted()) {
writeBuffer();
Thread.sleep(100);
}
}
catch (InterruptedException e) {}
writeBuffer();
}
};
bufferThread = new Thread(r, "TextComponentWriter Thread");
bufferThread.setDaemon(true);
bufferThread.start();
}
@Override
public void write(final int b) throws IOException {
write(new char[] {(char) b}, 0, 1);
}
@Override
public synchronized void write(char[] cbuf, int off, int len)
throws IOException {
buffer.append(cbuf, off, len);
}
private synchronized void writeBuffer() {
if (buffer.length() == 0)
return;
final String str = buffer.toString();
buffer = new StringBuilder();
EventQueue.invokeLater(new Runnable() {
public void run() {
if (isAutoScroll())
textComponent.setCaretPosition(textComponent.getDocument().getLength());
else if (textComponent.getCaretPosition() == textComponent.getDocument().getLength()
&& textComponent.getDocument().getLength() > 0)
textComponent.setCaretPosition(textComponent.getDocument().getLength() - 1);
try {
textComponent.getDocument().insertString(
textComponent.getDocument().getLength(), str, null);
}
catch (BadLocationException e) {
//Faça o log da exceção aqui
}
}
});
}
@Override
public void flush() {}
@Override
public void close() {
bufferThread.interrupt();
}
public boolean isAutoScroll()
{
return autoScroll;
}
public void setAutoScroll(boolean autoScroll)
{
this.autoScroll = autoScroll;
}
@Override
protected void finalize() throws Throwable {
close();
}
}
Esse worker thread torna o stream mais eficiente, caso o seu documento seja colorido. Descobrimos que o JTextArea não funciona lá tão bem assim nesses casos.
Me desculpe se estou sendo ignorante, mas os métodos: System.setOut() e System.setErr() pedem como parâmetro um objeto tipo PrintStream, e a classe TextComponentStream é do tipo OutputStream.