Redirección de salida en Java

En los exámenes de mis últimos alumnos, a los que aún debo matar por suspender, tenían que hacer un servidor. Dicho servidor debía tener una GUI básica para mostrar diversos mensajes. A pesar de que en este ejemplo no era necesario, me pregunté cómo hacer para poder poner dichos mensajes en el mismo TextComponent desde varias clases sin tener que ponerlo como variable de instancia en todas ellas.

La solución es sencilla, sólo se necesita crear una nueva clase que extienda de OutputStream y sobreescribir algunos métodos, básicamente, los de escritura. Lo primero, y suponiendo como nombre de clase TextComponentStream, es crear el constructor.

import java.io.*;
import java.awt.*;
public class TextComponentStream extends OutputStream{
private TextComponent tc;

public TextComponentStream(TextComponent tc){
super();
this.tc = tc;
}

Ahora sólo toca sobreescribir los métodos de escritura. OutputStream tiene tres métodos de escritura: write(byte[] b), write(byte[] b, int off, int len), write(int b). Este último hay que sobreescribirlo, aunque empezaremos por el primero. Para ello miramos en el API la clase String, y veremos que tiene un constructor al que se le pasa los argumentos del primer write y otro al que se le pasan los parámetros del segundo. Así tenemos:

public void write(byte[] b){
this.tc.setText(this.tc.getText()+(new String(b)));
}
public void write(byte[] b, int off, int len){
this.tc.setText(this.tc.getText()+(new String(b,off,len)));
}

Por último, write(int b) se implementaría así:

public void write(int b){
byte[] b1 = {(new Integer(b)).byteValue()};
this.write(b1);
}
}//Cerramos la clase.

Así ya está creada la clase. Ahora, para utilizarla desde cualquier lugar sólo hace falta redireccionar la salida estándar. Para ello se utilizará el método System.setOut(PrintStream p); de la siguiente manera:

System.setOut(new PrintStream(new TextComponent(tc)));

Siendo tc el TextComponent donde queremos mostrar los mensajes. Así, sólo se necesita poner System.out.println("Mensaje"); para que el mensaje se muestre en el TextComponent.

Author: Serabe

Mathematician, and Ruby and JavaScript programmer. Sometimes I speak at conferences and local meetups.

Leave a Reply

Your email address will not be published. Required fields are marked *