Przekierowanie wyjścia konsoli na ciąg znaków w Javie

Mam jedną funkcję, której Typ zwracania to VOID i wyświetla się bezpośrednio na konsoli.

Jednak potrzebuję tego wyjścia w łańcuchu, aby móc nad nim pracować.

Ponieważ nie mogę wprowadzić żadnych zmian z function z return type jest VOID więc muszę przekierować to Wyjście Do string.

Jak mogę przekierować go w Javie?

Istnieje wiele pytań dotyczących przekierowania stdout do string, ale przekierowują one tylko dane wejściowe pobrane od użytkownika, a nie Dane wyjściowe jakiejś funkcji...

Author: SRK, 2012-01-03

2 answers

Jeśli funkcja drukuje do System.out, możesz przechwycić to wyjście za pomocą metody System.setOut, aby zmienić System.out, aby przejść do PrintStream dostarczonej przez Ciebie. Jeśli utworzysz PrintStream podłączoną do ByteArrayOutputStream, możesz przechwycić wyjście jako String.

Przykład:

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

Ten program wyświetla tylko jedną linię:

    Here: Foofoofoo!
 88
Author: Ernest Friedman-Hill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-03 05:42:43

Oto Klasa użytkowa o nazwie ConsoleOutputCapturer. Pozwala na wyjście, aby przejść do istniejącej konsoli jednak za sceną utrzymuje przechwytywanie tekstu wyjściowego. Możesz kontrolować, co przechwycić za pomocą metod start/stop. Innymi słowy wywołaj start, aby rozpocząć przechwytywanie wyjścia konsoli, a po zakończeniu przechwytywania możesz wywołać metodę stop, która zwraca wartość łańcuchową trzymającą wyjście konsoli dla okna czasowego między wywołaniami start-stop. Ta klasa nie jest bezpieczna dla wątków chociaż.

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();
            }
        }
    }
}
 17
Author: Manasjyoti Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 06:38:44