Às vezes preciso desse tipo de coisa para depuração. Então encapsulo a saída em um TeeOutputStream, cujo construtor recebe uma segunda OutputStream para ter uma "cópia" dos dados sendo processados.
A mesma coisa vale para a entrada.
Estude as classes FilterInputStream e FilterOutputStream para descobrir como é que isso funciona, e o comando "tee" do Unix/Linux. (Chame o comand "man tee" para a documentação desse comando)
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Usado para depuração, para poder fazer uma análise da saída.
*/
public class TeeOutputStream extends FilterOutputStream {
/**
* Construtor.
* @param pOut A OutputStream.
*/
protected TeeOutputStream(OutputStream pOut) {
super(pOut);
}
/** OutputStream onde iremos jogar uma cópia da saída. */
private OutputStream out2;
/**
* Construtor.
* @param pOut O OutputStream que será 'wrapped'.
* @param pOut2 O OutputStream onde iremos jogar uma cópia da saída.
*/
public TeeOutputStream (OutputStream pOut, OutputStream pOut2) {
super (pOut);
out2 = pOut2;
}
/**
* @see java.io.FilterOutputStream#close()
*/
public void close() throws IOException {
out2.close();
super.close();
}
/**
* @see java.io.FilterOutputStream#flush()
*/
public void flush() throws IOException {
out2.flush();
super.flush();
}
/**
* @see java.io.FilterOutputStream#write(byte[], int, int)
*/
public void write(byte[] pB, int pOff, int pLen) throws IOException {
out2.write(pB, pOff, pLen);
super.write(pB, pOff, pLen);
}
/**
* @see java.io.FilterOutputStream#write(byte[])
*/
public void write(byte[] pB) throws IOException {
out2.write(pB);
super.write(pB);
}
/**
* @see java.io.FilterOutputStream#write(int)
*/
public void write(int pB) throws IOException {
out2.write(pB);
super.write(pB);
}
}
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Usado para depuração, para poder fazer uma análise da entrada.
*/
public class TeeInputStream extends FilterInputStream {
/**
* Construtor.
* @param pIn A InputStream.
*/
protected TeeInputStream(InputStream pIn) {
super(pIn);
}
/**
* Onde iremos jogar uma cópia da entrada.
*/
private OutputStream out;
/**
* Construtor.
* @param pIn A InputStream que será 'wrapped'.
* @param pOut A OutputStream onde iremos jogar uma cópia da saída.
*/
public TeeInputStream (InputStream pIn, OutputStream pOut) {
super (pIn);
out = pOut;
}
/**
* @see java.io.FilterInputStream#read()
*/
public int read() throws IOException {
int byt = super.read();
out.write(byt);
return byt;
}
/**
* @see java.io.FilterInputStream#read(byte[], int, int)
*/
public int read(byte[] pB, int pOff, int pLen) throws IOException {
int nBytes = super.read(pB, pOff, pLen);
if (nBytes > 0) {
out.write(pB, pOff, nBytes);
}
return nBytes;
}
/**
* @see java.io.FilterInputStream#read(byte[])
*/
public int read(byte[] pB) throws IOException {
int nBytes = super.read(pB);
if (nBytes > 0) {
out.write(pB, 0, nBytes);
}
return nBytes;
}
/**
* @see java.io.FilterInputStream#close()
*/
public void close() throws IOException {
out.close();
super.close();
}
}