2
votes

Afficher stdout dans le fichier et dans la console (avec System.setOut (new PrintStream (new File ("output-file.txt"))

Je souhaite enregistrer la sortie standard dans un fichier. Pour cela, j'ai utilisé
System.setOut (new PrintStream (new File ("output-file.txt")));

Maintenant, il n'y a pas de sortie dans la console.

        try {
            System.setOut(new PrintStream(new File("output-file.txt")));
        } catch (Exception e) {
             e.printStackTrace();
        }

Est-il possible d'afficher le stdout dans la console, bien que j'utilise stdout pour remplir un fichier?


1 commentaires

Utilisez System.out.println () pour imprimer la sortie sur la console.


4 Réponses :


1
votes

Je ne l'ai jamais essayé, mais je suppose que si vous sous-classez le flux d'impression par défaut, vous pouvez imprimer sur la console et le fichier par vous-même.

Quelque chose comme:

System.out = new MyPrintStream(myFile, System.out);

et peut-être l'appeler comme ceci:

class MyPrintStream extends printStream {

    private PrintStream secondPrinter;

    .....

    @Override 
    public void println(Object content) {
       super.println(content);
       secondPrinter.println(content);
    }
}


1 commentaires

L'inconvénient de cette solution: vous devez remplacer toutes les méthodes que vous souhaitez utiliser. comme println, print, flush, close etc.



0
votes

Vous ne pouvez pas utiliser les systèmes OutputStream pour écrire sur 2 sources. C'est une variable statique et elle ne peut avoir qu'une seule valeur à la fois.

Vous pouvez cependant essayer d'enregistrer une référence au OutputStream par défaut de la console, puis en changeant le Systems OutputStream en votre flux de sortie personnalisé, et en écrivant sur les deux avec une méthode personnalisée.


0 commentaires

3
votes

Vous pouvez créer un PrintWriter avec un OutputStream qui effectue les deux écritures.

final OutputStream stdOut = System.out;
try {
    System.setOut(new PrintStream(new OutputStream() {
        private PrintStream ps = new PrintStream(new File("output-file.txt"));

        @Override
        public void write(int b) throws IOException {
            ps.write(b);
            stdOut.write(b);
        }

        @Override
        public void flush() throws IOException {
            super.flush();
            ps.flush();
            stdOut.flush();
        }

        @Override
        public void close() throws IOException {
            super.close();
            ps.close();
            // stdOut.close(); // Normally not done
        }
    }));
} catch (Exception e) {
    e.printStackTrace();
}

System.out.println("Hello, world!");


2 commentaires

Merci pour l'aide. Cela fonctionne :) J'ai juste une question: je veux ajouter un horodatage au début de chaque System.out.println. comme: 2018-01-15 -> "ici un texte" Mais l'objet PrintStream et l'objet Output Stream fonctionnent avec un entier. Dois-je analyser l'horodatage en entier?


@Makuna Hmm, cela semble vraiment difficile. Presonally, je créerais juste une classe d'assistance que vous pouvez ensuite appeler à la place de System.out.println . Ou vous pouvez sous-classer le PrintStream lui-même au lieu du OutputStream à l'intérieur; alors vous aurez beaucoup plus de méthodes à utiliser. Bien sûr, je ne connais pas votre cas d'utilisation, il m'est donc difficile de donner une solution exacte. Si vous êtes coincé dans le développement de cela, vous devriez probablement poser une nouvelle question, car il s'agit essentiellement d'un nouveau problème.



0
votes

Vous pouvez créer une nouvelle sous-classe de la classe PrintStream, puis remplacer ses méthodes pour écrire dans un deuxième Stream, puis la transmettre à System.out comme vous en avez déjà une. Lectures complémentaires et exemple d'implémentation: https://books.google.ch/books?id=lbnjAwAAQBAJ&lpg=PA326&ots=j7OUeuXzIa&dq=java%20duplicate%20printstream&pg=PA326#v=onepage&q=java%20duplicate%20sestream >


0 commentaires