2010-05-17 6 views
37

Je cours une application à partir d'un autre à des fins de test. Je veux rediriger la sortie de l'application testée vers un fichier, afin que je puisse avoir un journal après chaque test.System.out à un fichier dans Java

Existe-t-il un moyen de rediriger la sortie d'une application vers un fichier à partir de la ligne de commande dans Java?

+2

il est plus susceptible d'être une solution de redirection externe par rapport à la machine virtuelle Java, comme descripteurs de fichier dans bash/sh (par exemple "app.exe> ​​fichier.log 2> & 1"), sauf si vous utilisez une bibliothèque de journalisation configurable – bobah

Répondre

64

Vous pouvez utiliser le redirecteur de flux de sortie pris en charge par la ligne de commande Windows, les coquilles * nix, par ex.

java -jar myjar.jar > output.txt 

Sinon, comme vous exécutez l'application à l'intérieur de la machine virtuelle, vous pouvez rediriger System.out à partir de Java lui-même. Vous pouvez utiliser la méthode

System.setOut(PrintStream ps)

qui remplace le flux de sortie standard, de sorte que tous les appels à System.out aller au courant que vous spécifiez. Vous pouvez le faire avant d'exécuter votre application enveloppée, par ex. appel System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt"))));

Si vous utilisez un wrapper que vous ne pouvez pas modifier, créez votre propre wrapper. Donc, vous avez wrapper FEST -> wrapper redirecteur de flux -> application testée.

Par exemple, vous pouvez mettre en œuvre une enveloppe simple comme ceci:

public class OutputRedirector 
{ 
    /* args[0] - class to launch, args[1]/args[2] file to direct System.out/System.err to */ 
    public static void main(String[] args) throws Exception 
    { // error checking omitted for brevity 
     System.setOut(outputFile(args(1)); 
     System.setErr(outputFile(args(2)); 
     Class app = Class.forName(args[0]); 
     Method main = app.getDeclaredMethod("main", new Class[] { (new String[1]).getClass()}); 
     String[] appArgs = new String[args.length-3]; 
     System.arraycopy(args, 3, appArgs, 0, appArgs.length); 
     main.invoke(null, appArgs); 
    } 
    protected PrintStream outputFile(String name) { 
     return new PrintStream(new BufferedOutputStream(new FileOutputStream(name)), true); 
    } 
} 

Vous invoquez avec 3 params supplémentaires - la classe principale pour exécuter, et la sortie/erreur dirige.

+3

Et pour être clair, cela n'a rien à voir avec java lui-même, mais est une fonctionnalité standard offerte par le shell. –

+1

merci, j'ai mis à jour ma réponse pour le rendre clair. – mdma

+0

J'ai essayé de le faire mais je me retrouve avec un fichier txt vide. La sortie va toujours au terminal. Le fait est que j'utilise une classe d'aide d'une bibliothèque de test appelée FEST (http://fest.easytesting.org). Cette classe d'aide accepte les paramètres qu'elle peut ensuite transmettre à l'application. Le redirecteur de flux pourrait ne pas tout à fait entrer ici – Omar

24

Oui, vous pouvez définir le fichier désiré comme celui-ci.

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

-1 pour la trace de la pile d'impression – artbristol

+0

@artbristol -1 s'il y avait un bloc vide –

+0

Je sais que c'est un très vieux fil de discussion Peut-on expliquer la différence entre 'System.setOut (new PrintStream (new File ("output-file.txt"))); 'et' new PrintStream (nouveau BufferedOutputStream (nouveau FileOutputStream ("output-file.txt")), true); '? Pourquoi choisir l'un par rapport à l'autre? si je demande quelque chose de naïf, cependant je ne vois pas de différence.J'utilise JDK8 –

7

Afin d'améliorer « vijay.shad » réponse je le code ci-dessous pour diriger le fichier dans le répertoire de Linux ou MyDocuments dans Windows.

try { 
     System.setOut(new PrintStream(new File(FileSystemView.getFileSystemView() 
       .getDefaultDirectory().toString() 
       + File.separator + "output-file.txt"))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

-1 pour la trace de la pile d'impression – artbristol

41

Lorsque vous utilisez ce constructeur:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")));

n'oubliez pas de mettre à true la purge des tampons, i.e. .:

new PrintStream(new BufferedOutputStream(new FileOutputStream("file.txt")), true);

sinon vous pouvez obtenir des fichiers vides, même après votre programme se termine. System.out.println() est utilisé pour imprimer des messages sur la console.

+1

Nice catch man! – yhcowboy

+0

@ben [Il y a un constructo r] (https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#PrintStream (java.io.OutputStream,% 20boolean)) sur PrintStream qui prend en charge le vidage automatique. – heenenee

+0

@heenenee Je vois ça. Cependant, mon commentaire faisait référence à une partie de la réponse qui a été modifiée après que j'ai fait mon commentaire. Voir aussi l'historique d'édition de la réponse. – ben

3

Le système est une classe définie dans le package java.lang. out est une instance de PrintStream, membre public et statique de la classe System. Comme toutes les instances de la classe PrintStream ont une méthode publique println().

System.out est un PrintStream statique qui écrit à la console. Nous pouvons rediriger la sortie vers un autre PrintStream en utilisant la méthode System.setOut() qui prend un PrintStream comme paramètre.

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 

public class SetPrintStream { 
    public static void main(String[] args) throws FileNotFoundException{ 
      System.out.println("Print on console"); 

      // Store console print stream. 
      PrintStream ps_console = System.out; 

      File file = new File("file.txt"); 
      FileOutputStream fos = new FileOutputStream(file); 

      // Create new print stream for file. 
      PrintStream ps = new PrintStream(fos); 

      // Set file print stream. 
      System.setOut(ps); 
      System.out.println("Print in the file !!"); 

      // Set console print stream. 
      System.setOut(ps_console); 
      System.out.println("Console again !!"); 
} 
} 

Output: 
Print on console 
Console again !! 
new file.txt will be created. 

Pour plus d'informations, voir mon blog:

http://javaexplorer03.blogspot.in/2016/02/how-do-i-redirect-standard-output-to.html

1
File file = new File("xyz.txt");   
    PrintStream printStreamToFile = new PrintStream(file); 
    System.setOut(printStreamToFile); 
    System.out.println("Hello I am writing to File xyz.txt"); 
Questions connexes