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?
4 Réponses :
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); } }
L'inconvénient de cette solution: vous devez remplacer toutes les méthodes que vous souhaitez utiliser. comme println, print, flush, close etc.
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.
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!");
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.
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 >
Utilisez
System.out.println ()
pour imprimer la sortie sur la console.