Подтвердить что ты не робот

Перенаправить вывод консоли в строку в java

У меня есть одна функция, чей тип возврата - VOID, и он печатает непосредственно на консоли.

Однако мне нужен этот вывод в строке, чтобы я мог работать над ним.

Поскольку я не могу вносить какие-либо изменения в функцию с возвращаемым типом, это VOID, поэтому мне нужно перенаправить этот вывод в строку.

Как я могу перенаправить его в JAVA?

Есть много вопросов относительно перенаправления stdout на строку, но они перенаправляют только входные данные, полученные от пользователя, а не вывод некоторых функций...

4b9b3361

Ответ 1

Если функция печатает на System.out, вы можете записать этот вывод с помощью метода System.setOut, чтобы изменить System.out, чтобы перейти к PrintStream, предоставленному вами. Если вы создаете PrintStream, подключенный к ByteArrayOutputStream, вы можете записать вывод как String.

Пример:

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

Эта программа печатает только одну строку:

    Here: Foofoofoo!

Ответ 2

Вот класс утилиты с именем ConsoleOutputCapturer. Он позволяет выводить выход на существующую консоль, однако позади сцены сохраняется захват выходного текста. Вы можете управлять захватом с помощью методов старт/стоп. Другими словами, вызовите начало запуска захвата вывода консоли, и как только вы закончите захват, вы можете вызвать метод stop, который возвращает значение String, содержащее вывод консоли для временного окна между вызовами start-stop. Однако этот класс не является потокобезопасным.

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<OutputStream> outputStreams;

        public OutputStreamCombiner(List<OutputStream> 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();
            }
        }
    }
}