web-dev-qa-db-fra.com

Rediriger la sortie de la console vers string in java

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

Cependant, j'ai besoin de cette sortie en chaîne pour pouvoir y travailler.

Comme je ne peux pas apporter de modifications avec function avec le type de retour est VOID, je dois donc rediriger cette sortie en chaîne.

Comment puis-je le rediriger en JAVA?

Il y a beaucoup de questions concernant la redirection de stdout vers string, mais ils redirigent uniquement les entrées prises par l'utilisateur et non la sortie de certaines fonctions ...

55
SRK

Si la fonction est en cours d’impression sur System.out, vous pouvez capturer cette sortie en utilisant le System.setOut méthode pour changer System.out pour aller à un PrintStream que vous avez fourni. Si vous créez un PrintStream connecté à un ByteArrayOutputStream, vous pouvez alors capturer le résultat sous la forme de 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 ligne:

Here: Foofoofoo!
103

Voici un utilitaire de classe nommé ConsoleOutputCapturer. Il permet à la sortie d'aller sur la console existante, mais derrière la scène continue de capturer le texte de sortie. Vous pouvez contrôler les éléments à capturer avec les méthodes de démarrage/d'arrêt. En d'autres termes, call start commence à capturer la sortie de la console. Une fois la capture terminée, vous pouvez appeler la méthode stop qui renvoie une valeur String contenant la sortie de la console pour la fenêtre temporelle entre les appels arythmiques. Cette classe n'est cependant pas thread-safe.

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