2010-01-03 5 views
57

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. Qu'est-ce qui ne va pas?Comment écrire la sortie de la console dans un fichier txt

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

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

+0

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

Répondre

105

Vous devez faire quelque chose comme ceci:

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

La deuxième déclaration est la clé. Il change la valeur de l'attribut System.out supposé "final" pour être la valeur PrintStream fournie.

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


Je voudrais simplement ajouter qu'il est généralement une meilleure idée d'utiliser un sous-système d'enregistrement comme Log4j, Logback ou le sous-système Java standard java.util.logging. Ceux-ci offrent des fonctionnalités telles que le contrôle de journalisation à granularité fine via des fichiers de configuration d'exécution, la prise en charge des fichiers journaux de roulement, les flux vers la journalisation du système.

Ou, si ce que vous faites est pas « exploitation forestière », puis envisager soit:

  • rediriger la sortie standard vers un fichier sur la ligne de commande, ou
  • changer votre application à utiliser un flux out passé comme un paramètre plutôt que d'écrire à System.out.

déconner avec (par exemple réorientent) System.out est susceptible de provoquer de mauvaises surprises pour tout autre code dans votre machine virtuelle Java qui ne s'y attend pas que cela se produise.

+0

Merci Stephen ... mon problème a été résolu. Comme suggéré par ZoogieZork, j'ai mis ce code au tout début de mon programme ... et ça marche! Merci tout le monde. – Jessy

+0

@Bozho - taa ... corrigé. –

+0

Je recommanderais une approche plus sûre, plutôt que de déconner avec les attributs du système. Cela pourrait entraîner des effets indésirables. –

4

Vous pouvez utiliser System.setOut() au début de votre programme pour rediriger toutes les sorties via System.out à votre propre PrintStream.

9

Créer 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 ne l'ai pas compris le traitement IO approprié dans la classe ci-dessus, et il ne compilera pas - faire vous-même Voir également la configuration du nom de fichier Remarque l'argument « vrai ». 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) appel Logger.log(str)

Cette approche manuelle est pas préférable. Utilisez un cadre de l'exploitation forestière - slf4j, log4j, commons-logging, et beaucoup d'autres

+0

Vous avez probablement voulu dire 'PrintWriter out = new PrintWriter (nouveau FileWriter (" output.txt ", true),', pour ajouter et purger automatiquement, plutôt que "PrintWriter out = new PrintWriter (new FileWriter ("output.txt"), true); 'qui ne fait que se vider automatiquement. –

+0

@AhmedNassar bonne capture – Bozho

+0

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

19

-préserver la sortie de la console, qui est, écrire dans un fichier et ont également affiché 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éter)

7

En plus de plusieurs progra approches matic discutées, une autre option consiste à rediriger la sortie standard du shell. Voici plusieurs exemples Unix et DOS.

+0

ne fonctionne pas avec Java. – drzymala

+1

Qu'est-ce qui ne fonctionne pas avec Java? – trashgod

+2

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

3

Ceci est mon idée de ce que vous essayez de le faire et il fonctionne très bien:

public static void main(String[] args) throws IOException{ 

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

    BufferedWriter out = new BufferedWriter(new FileWriter("c://output.txt")); 
    try { 
     String inputLine = null; 
     do { 
      inputLine=in.readLine(); 
      out.write(inputLine); 
      out.newLine(); 
     } while (!inputLine.equalsIgnoreCase("eof")); 
     System.out.print("Write Successful"); 
    } catch(IOException e1) { 
     System.out.println("Error during reading/writing"); 
    } finally { 
     out.close(); 
     in.close(); 
    } 
} 
25

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

javac myFile.java 
java ClassName > a.txt 

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

+7

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

1

La meilleure façon d'écrire la sortie de la console vers un fichier texte est

//create a file first  
    PrintWriter outputfile = new PrintWriter(filename); 
//replace your System.out.print("your output"); 
    outputfile.print("your output"); 
    outputfile.close(); 
+1

Veuillez ne plus apporter de modifications comme [this] (http://stackoverflow.com/review/suggested-edits/12501763). Vous l'avez activement fait pire - sans raison claire. S'il vous plaît ne pas abuser des modifications pour gagner la réputation. – Rob

1

Pour écrire la sortie de la console dans un fichier txt

public static void main(String[] args) { 
    int i; 
    List<String> ls = new ArrayList<String>(); 
    for (i = 1; i <= 100; i++) { 
     String str = null; 
     str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A TEXT FILE"; 
     ls.add(str); 
    } 
    String listString = ""; 
    for (String s : ls) { 
     listString += s + "\n"; 
    } 
    FileWriter writer = null; 
    try { 
     writer = new FileWriter("final.txt"); 
     writer.write(listString); 
     writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Si vous souhaitez générer le PDF plutôt que le fichier texte, vous utilisez la dépendance donnée ci-dessous:

<dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.0.6</version> 
</dependency> 

Pour générer un PDF, utilisez ce code:

public static void main(String[] args) { 
    int i; 
    List<String> ls = new ArrayList<String>(); 
    for (i = 1; i <= 100; i++) { 
     String str = null; 
     str = +i + ":- HOW TO WRITE A CONSOLE OUTPUT IN A PDF"; 
     ls.add(str); 
    } 
    String listString = ""; 

    for (String s : ls) { 
     listString += s + "\n"; 
    } 
    Document document = new Document(); 
    try { 
     PdfWriter writer1 = PdfWriter 
       .getInstance(
         document, 
         new FileOutputStream(
           "final_pdf.pdf")); 
     document.open(); 
     document.add(new Paragraph(listString)); 
     document.close(); 
     writer1.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (DocumentException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Je ne pense pas que les lecteurs ont besoin de tout ce code pour créer une liste de chaînes à écrire; ils pourraient le faire eux-mêmes. Cette réponse se résume à "après avoir écrit quelque chose à System.out, l'écrire aussi dans un fichier avec un FileWriter ou un PdfWriter". – Noumenon

+0

@Noumenon; Monsieur, il est possible que vous ayez beaucoup de connaissances sur Java, mais sur ce forum ouvert, il y a beaucoup de nouveaux venus et un morceau complet de code est une aide précieuse pour eux. –

+0

Merci pour la réponse mature. Vous avez raison de dire qu'il est utile d'avoir quelque chose que vous pouvez réellement lancer et tester - je fournis aussi des exemples de travail. Je ne veux pas avoir à lire l'exemple pour trouver la réponse. La même réponse serait améliorée si elle était précédée d'un résumé: "Écris-la simplement dans un fichier avec un FileWriter Exemple de travail:" En note, Stack Overflow est différent d'un forum ouvert car les réponses sont destinées à aider beaucoup futurs lecteurs en plus de l'affiche originale. Ils sont plus susceptibles d'essayer et d'améliorer une approche facile à comprendre en un coup d'œil. – Noumenon

0
PrintWriter out = null; 
try { 
    out = new PrintWriter(new FileWriter("C:\\testing.txt")); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
out.println("output"); 
out.close(); 

Je me sers chemin absolu pour le FileWriter. Cela fonctionne pour moi comme un charme. Assurez-vous également que le fichier est présent dans l'emplacement. Sinon, il lancera une exception FileNotFoundException. Cette méthode ne crée pas un nouveau fichier dans l'emplacement cible si le fichier est introuvable.

+0

Qu'avez-vous changé dans le code et pourquoi cela résout-il le problème? – JJJ

+0

Bien que cet extrait de code puisse résoudre la question, [y compris une explication] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) aide vraiment à améliorer la qualité de votre message. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. – DimaSan

+0

DimaSan Merci de m'avoir signalé. Vous avez raison. –

0

Dans netbeans, vous pouvez cliquer avec le bouton droit de la souris, puis enregistrer en tant que fichier .txt. Ensuite, basé sur le fichier .txt créé, vous pouvez convertir dans le fichier dans n'importe quel format que vous souhaitez obtenir.

Questions connexes