Rediriger la sortie de la console vers une chaîne en java

J'ai une fonction dont le type de retour est VOID et il s'imprime directement sur la console.

Cependant, j'ai besoin de cette sortie dans la chaîne pour que je puisse travailler dessus.

Comme je ne peux pas apporter de modifications avec la fonction avec le type de retour est vide, je dois donc rediriger cette sortie vers string.

Comment puis-je le rediriger en JAVA?

Il y a beaucoup de questions concernant la redirection de stdout vers string mais elles redirigent uniquement les entrées prises par l'utilisateur et non la sortie d'une fonction...

45
demandé sur SRK 2012-01-03 09:34:43

2 réponses

Si la fonction est en cours d'impression sur System.out, Vous pouvez capturer cette sortie en utilisant la méthode System.setOut pour changer System.out pour passer à un PrintStream fourni par vous. Si vous créez un PrintStream connecté à un ByteArrayOutputStream, alors vous pouvez capturer la sortie comme un String.

Exemple:

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

Ce programme n'imprime qu'une seule ligne:

    Here: Foofoofoo!
88
répondu Ernest Friedman-Hill 2012-01-03 05:42:43

Voici une classe utilitaire nommée ConsoleOutputCapturer. Il permet à la sortie d'aller à la console existante mais derrière la scène continue de capturer le texte de sortie. Vous pouvez contrôler ce qu'il faut capturer avec les méthodes start/stop. En d'autres termes, appelez start pour commencer à capturer la sortie de la console et une fois que vous avez terminé la capture, vous pouvez appeler la méthode stop qui renvoie une valeur de chaîne contenant la sortie de la console pour la fenêtre de temps entre les appels start-stop. Cette classe n'est pas thread-safe bien.

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
répondu Manasjyoti Sharma 2016-04-27 06:38:44