Redirige la salida de la consola a una cadena en java

Tengo una función cuyo tipo de devolución es VACÍO e imprime directamente en la consola.

Sin embargo, necesito esa salida en cadena para poder trabajar en ella.

Como no puedo hacer ningún cambio con la función con return, el tipo es VOID, así que tengo que redirigir esa salida a la cadena.

¿Cómo puedo redirigirlo en JAVA?

Hay muchas preguntas con respecto a redirigir stdout a la cadena, pero redirigen solo la entrada tomada del usuario y no la salida de alguna función …

Si la función está imprimiendo en System.out , puede capturar esa salida utilizando el método System.setOut para cambiar System.out para ir a un PrintStream proporcionado por usted. Si crea un PrintStream conectado a ByteArrayOutputStream , puede capturar el resultado como una String .

Ejemplo:

  // Create a stream to hold the output ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); // IMPORTANT: Save the old System.out! PrintStream old = System.out; // Tell Java to use your special stream System.setOut(ps); // Print some output: goes to your special stream System.out.println("Foofoofoo!"); // Put things back System.out.flush(); System.setOut(old); // Show what happened System.out.println("Here: " + baos.toString()); 

Este progtwig imprime solo una línea:

  Here: Foofoofoo! 

Aquí hay una clase de utilidad llamada ConsoleOutputCapturer. Permite que la salida vaya a la consola existente, pero detrás de la escena sigue capturando el texto de salida. Puede controlar qué capturar con los métodos de inicio / detención. En otras palabras, llame a start para comenzar a capturar la salida de la consola y una vez que termine de capturar puede llamar al método stop que devuelve un valor String que contiene la salida de la consola para la ventana de tiempo entre las llamadas start-stop. Sin embargo, esta clase no es segura para subprocesos.

 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.Arrays; import java.util.List; public class ConsoleOutputCapturer { private ByteArrayOutputStream baos; private PrintStream previous; private boolean capturing; public void start() { if (capturing) { return; } capturing = true; previous = System.out; baos = new ByteArrayOutputStream(); OutputStream outputStreamCombiner = new OutputStreamCombiner(Arrays.asList(previous, baos)); PrintStream custom = new PrintStream(outputStreamCombiner); System.setOut(custom); } public String stop() { if (!capturing) { return ""; } System.setOut(previous); String capturedValue = baos.toString(); baos = null; previous = null; capturing = false; return capturedValue; } private static class OutputStreamCombiner extends OutputStream { private List outputStreams; public OutputStreamCombiner(List outputStreams) { this.outputStreams = outputStreams; } public void write(int b) throws IOException { for (OutputStream os : outputStreams) { os.write(b); } } public void flush() throws IOException { for (OutputStream os : outputStreams) { os.flush(); } } public void close() throws IOException { for (OutputStream os : outputStreams) { os.close(); } } } }