Capturar el contenido de la salida estándar en Java
Pregunta
Estoy invocando una función que imprime alguna cadena en mi consola/salida estándar. Necesito capturar esta cadena. No puedo modificar la función que está realizando la impresión, ni cambiar el comportamiento de tiempo de ejecución a través de la herencia. No puedo encontrar ningún método predefinido que me permita hacer esto.
¿El JVM almacena un búfer de contenido impreso?
¿Alguien sabe de un método de Java que me ayude?
Solución
Puede reemplazar temporalmente System.err o System.out con una transmisión que escribe en buffer de cadena.
Otros consejos
Puede redirigir la salida estándar llamando
System.setOut(myPrintStream);
O - si necesita registrarlo en tiempo de ejecución, canse la salida a un archivo:
java MyApplication > log.txt
Otro truco: si desea redirigir y no puede cambiar el código: implementa un envoltorio rápido que llama a su aplicación y comience esa:
public class RedirectingStarter {
public static void main(String[] args) {
System.setOut(new PrintStream(new File("log.txt")));
com.example.MyApplication.main(args);
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
public class RedirectIO
{
public static void main(String[] args)
{
PrintStream orgStream = null;
PrintStream fileStream = null;
try
{
// Saving the orginal stream
orgStream = System.out;
fileStream = new PrintStream(new FileOutputStream("out.txt",true));
// Redirecting console output to file
System.setOut(fileStream);
// Redirecting runtime exceptions to file
System.setErr(fileStream);
throw new Exception("Test Exception");
}
catch (FileNotFoundException fnfEx)
{
System.out.println("Error in IO Redirection");
fnfEx.printStackTrace();
}
catch (Exception ex)
{
//Gets printed in the file
System.out.println("Redirecting output & exceptions to file");
ex.printStackTrace();
}
finally
{
//Restoring back to console
System.setOut(orgStream);
//Gets printed in the console
System.out.println("Redirecting file output back to console");
}
}
}