Article updated on

 System.err and System.out en Java ejemplos

En java los 3 primeros streamsstdin (standard input) , stdout (standard output) and stderr (standard output error)  se manejar por defecto por System.in, Sytem.out y System.err respectivamente. A menudo necesitamos cambiar la salida de acuerdo con nuestras necesidades. Esto se puede hacer de varias maneras diferentes como por ejemplo especificarlo desde el SO o usar Java para elegir como queremos gestionarlos.

En los siguientes ejemplos se muestra como manejar estos streams en diferentes escenarios.

 

Redirigir los Streams a archivos desde la consola Unix

java MyExample > output.log 2>error.log

 

Redirigir los Streams de Salida a Archivos en Java

Este ejemplo redirige los 2 streams de salida a dos archivos. Produce un ArithmeticException dividiendo por 0 y guarda las trazas en el stderr.log. No poducirá ninguna salida por la consola.

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class OutPuts {
    public static void main(String[] args) {
        try {
            FileOutputStream fout = new FileOutputStream("stdout.log");
            FileOutputStream ferr = new FileOutputStream("stderr.log");
            PrintStream out = new PrintStream(fout);
            PrintStream err = new PrintStream(ferr);
            System.setOut(out);
            System.setErr(err);            
            out.println("trace console 1");            
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        System.out.println("trace console 2");
        System.out.println(100/0);
    }

}

 

Redirigir el Stream de salida de error al Stream de salida estandar

public class OutPuts {
    public static void main(String[] args) {    
        System.setErr(System.out);
        System.out.println("trace console");
        System.out.println(100/0);
    }
}

 

Redirigir los Streams de Salida a un archivo y sacar los resultados por Consola

En este ejemplo se crea una clase a modo de "proxy" para que cada vez que se llame al os metodos print o println su contenido sea guardado en los archivos especificados y lo muestre por consola.

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class OutPuts {
    public static void main(String[] args) {
        System.setOut(new ProxyPrintStream(System.out, "stdout.log"));
        System.setErr(new ProxyPrintStream(System.err, "stderr.log"));        
        System.out.println("trace console 1");
        System.out.println(100 / 0);
    }
}
class ProxyPrintStream extends PrintStream{    
    private PrintStream fileStream = null;
    private PrintStream originalPrintStream = null;
    public ProxyPrintStream(PrintStream out, String FilePath) {
        super(out);
        originalPrintStream = out;
         try {
             FileOutputStream fout = new FileOutputStream(FilePath,true);
             fileStream = new PrintStream(fout);
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        }
    }    
    public void print(final String str) {
        originalPrintStream.print(str);
        fileStream.print(str);
    }
    public void println(final String str) {
        originalPrintStream.println(str);
        fileStream.println(str);
    }        
}

* Este ejemplo añade o crea un archivo ya existente para que cree un archivo nuevo cada vez cambia  new FileOutputStream(FilePath,true) por new FileOutputStream(FilePath).

 

Redirigir los Streams de salida en Log4J

Este ejemplo muestra todas las trazas de los streams de salida estandar por los archivos de los del log4j. Sirve para asegurarse que todas las trazas de error o de código puestas en la aplicación incluidas las que usan System.out.println o System.out.print se guarden en los archvios de log.

    /**
     * To change tie the sysOut and sysErr to the log
     */
    public static void tieSystemOutAndErrToLog() {
        System.setOut(createLoggingProxy(System.out));
        System.setErr(createLoggingProxy(System.err));
    }
    public static PrintStream createLoggingProxy(final PrintStream realPrintStream) {
        return new PrintStream(realPrintStream) {
            public void print(final String string) {
                logger.warn(string);
            }
            public void println(final String string) {
                logger.warn(string);
            }
        };
    }