70 votes

Comment écrire la sortie de la console dans un fichier txt ?

J'ai essayé d'écrire la sortie de la console dans un fichier txt en utilisant cette suggestion de code ( http://www.daniweb.com/forums/thread23883.html# ) mais je n'ai pas réussi. Quel est le problème ?

try {
      //create a buffered reader that connects to the console, we use it so we can read lines
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

      //read a line from the console
      String lineFromInput = in.readLine();

      //create an print writer for writing to a file
      PrintWriter out = new PrintWriter(new FileWriter("output.txt"));

      //output to the file a line
      out.println(lineFromInput);

      //close the file (VERY IMPORTANT!)
      out.close();
   }
      catch(IOException e1) {
        System.out.println("Error during reading/writing");
   }

1 votes

L'exemple de code que vous avez donné écrit la console entrée dans un fichier. Ce que vous essayez de faire n'est pas très clair. Pouvez-vous donner plus de détails ?

0 votes

J'ai de nombreuses sorties sur la console qui résultent de system.out.println. J'essaie d'écrire toutes ces sorties dans un fichier .txt.

130voto

Stephen C Points 255558

Vous devez faire quelque chose comme ça :

PrintStream out = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(out);

La deuxième déclaration est la clé. Elle change la valeur du supposé "final" System.out pour être la valeur PrintStream fournie.

Il existe des méthodes analogues ( setIn y setErr ) pour modifier les flux d'entrée et d'erreur standard ; reportez-vous à l'onglet java.lang.System javadocs pour plus de détails.

Une version plus générale de ce qui précède est la suivante :

PrintStream out = new PrintStream(
        new FileOutputStream("output.txt", append), autoFlush);
System.setOut(out);

Si append es true le flux sera ajouté à un fichier existant au lieu de le tronquer. Si autoflush es true le tampon de sortie sera vidé à chaque fois qu'un tableau d'octets est écrit, l'une des méthodes suivantes étant utilisée pour l'écrire println est appelée, ou une \n est écrit.


Je voudrais juste ajouter que c'est généralement une meilleure idée d'utiliser un sous-système de journalisation tel que Log4j , Logback ou la version standard de Java java.util.logging sous-système. Ceux-ci offrent un contrôle fin de la journalisation via des fichiers de configuration d'exécution, la prise en charge de fichiers journaux roulants, des flux de journalisation du système, etc.

Sinon, si vous n'êtes pas "logué", considérez ce qui suit :

  • Avec les shells classiques, vous pouvez rediriger la sortie standard (ou l'erreur standard) vers un fichier sur la ligne de commande ; par exemple

    $ java MyApp > output.txt   

    Pour plus d'informations, reportez-vous à un tutoriel shell ou à une entrée de manuel.

  • Vous pouvez modifier votre application pour utiliser un out transmis en tant que paramètre d'une méthode ou par le biais d'un singleton ou d'une injection de dépendance, plutôt que d'écrire dans un fichier de type System.out .

Changer System.out peut causer de mauvaises surprises pour d'autres codes de votre JVM qui ne s'attendent pas à ce que cela se produise. (Une bibliothèque Java correctement conçue évitera de dépendre de System.out y System.err mais vous pouvez être malchanceux).

37voto

ali ahmad Points 71

Il n'y a pas besoin d'écrire de code, juste en cmd sur la console, vous pouvez écrire :

javac myFile.java
java ClassName > a.txt

Les données de sortie sont enregistrées dans le fichier a.txt.

10 votes

Cela fonctionne pour la sortie standard. Si vous voulez capturer aussi la sortie d'erreur, utilisez : "java NomClasse > a.txt 2>&1". Par exemple, le simple "java -version" écrit dans la console.err que vous ne pouvez capturer qu'avec mon extension.

1 votes

Pour le fichier jar java -jar yourapp.jar > a.txt 2>&1

27voto

Carlos Heuberger Points 11804

À préserver la sortie de la console, c'est-à-dire écrire dans un fichier et l'afficher également sur la console, vous pouvez utiliser une classe comme :

    public class TeePrintStream extends PrintStream {
        private final PrintStream second;

        public TeePrintStream(OutputStream main, PrintStream second) {
            super(main);
            this.second = second;
        }

        /**
         * Closes the main stream. 
         * The second stream is just flushed but <b>not</b> closed.
         * @see java.io.PrintStream#close()
         */
        @Override
        public void close() {
            // just for documentation
            super.close();
        }

        @Override
        public void flush() {
            super.flush();
            second.flush();
        }

        @Override
        public void write(byte[] buf, int off, int len) {
            super.write(buf, off, len);
            second.write(buf, off, len);
        }

        @Override
        public void write(int b) {
            super.write(b);
            second.write(b);
        }

        @Override
        public void write(byte[] b) throws IOException {
            super.write(b);
            second.write(b);
        }
    }

et utilisé comme dans :

    FileOutputStream file = new FileOutputStream("test.txt");
    TeePrintStream tee = new TeePrintStream(file, System.out);
    System.setOut(tee);

( juste une idée, pas complète )

12voto

Bozho Points 273663

Créez la méthode suivante :

public class Logger {
    public static void log(String message) { 
      PrintWriter out = new PrintWriter(new FileWriter("output.txt", true), true);
      out.write(message);
      out.close();
    }
}

(Je n'ai pas inclus la gestion correcte des entrées-sorties dans la classe ci-dessus, et elle ne compilera pas - faites-le vous-même. Pensez aussi à configurer le nom du fichier. Notez l'argument "true". Cela signifie que le fichier ne sera pas recréé à chaque fois que vous appelez la méthode).

Alors, au lieu de System.out.println(str) appelez Logger.log(str)

Cette approche manuelle n'est pas préférable. Utilisez un framework de journalisation - slf4j, log4j , commons-logging et bien d'autres encore

0 votes

Vous vouliez probablement dire PrintWriter out = new PrintWriter(new FileWriter("output.txt", true), true); afin d'ajouter et d'effacer automatiquement les données, au lieu de PrintWriter out = new PrintWriter(new FileWriter("output.txt"), true); qui ne fait que s'autonettoyer.

0 votes

Le fichier texte ne sera-t-il pas modifié chaque fois que vous créerez un nouveau printWriter ?

0 votes

L'un des paramètres "true" est "append", le texte sera donc ajouté.

7voto

trashgod Points 136305

Outre les différentes approches programmatiques évoquées, une autre option consiste à rediriger la sortie standard du shell. Voici plusieurs Unix y DOS exemples.

2 votes

Désolé, j'ai oublié l'esperluette dans la commande. La commande sous unix est : "java -jar yourApplication.jar >& yourLogFile.txt"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X