Redirecionar a saída do console para string em java

Eu tenho uma function cujo tipo de retorno é VOID e imprime diretamente no console.

No entanto, preciso dessa saída em string para poder trabalhar nela.

Como eu não posso fazer alterações com a function com o tipo de retorno é VOID, então eu tenho que redirect essa saída para string.

Como posso redirecioná-lo em JAVA?

Existem muitas questões relacionadas ao redirecionamento de stdout para string, mas elas redirecionam apenas a input obtida do usuário e não a saída de alguma function …

Se a function estiver imprimindo em System.out , você poderá capturar essa saída usando o método System.setOut para alterar System.out para ir para um PrintStream fornecido por você. Se você criar um PrintStream conectado a um ByteArrayOutputStream , poderá capturar a saída como uma String .

Exemplo:

  // 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 programa imprime apenas uma linha:

  Here: Foofoofoo! 

Aqui está uma class de utilitário chamada ConsoleOutputCapturer. Ele permite que a saída vá para o console existente, mas atrás da cena continua capturando o texto de saída. Você pode controlar o que capturar com os methods start / stop. Em outras palavras, chame start para começar a capturar a saída do console e, assim que estiver pronto, você poderá chamar o método stop, que retorna um valor String mantendo a saída do console para a janela de tempo entre as chamadas start-stop. Esta class não é thread-safe embora.

 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(); } } } }