2010-05-17 6 views
37

Ich führe eine Anwendung aus einem anderen zu Testzwecken. Ich möchte die Ausgabe für die getestete App in eine Datei umleiten, damit ich nach jedem Test ein Protokoll erstellen kann.System.out zu einer Datei in Java

Gibt es eine Möglichkeit, die Ausgabe einer App in eine Datei von der Befehlszeile in Java umleiten?

+2

es höchstwahrscheinlich eine Lösung extern in Bezug auf Java VM sein werden, wie die Umleitung Filedeskriptoren in bash/sh (zB "app.exe> ​​file.log 2> & 1"), es sei denn, Sie verwenden eine konfigurierbare Logging-Bibliothek – bobah

Antwort

64

Sie können den Ausgabe-Stream-Redirector verwenden, der von der Windows-Befehlszeile unterstützt wird, * nix-Shells, z.

java -jar myjar.jar > output.txt 

Alternativ können, wie Sie die App aus dem Inneren des vm laufen haben, könnten Sie System.out aus Java selbst umleiten. Sie können die Methode

System.setOut(PrintStream ps)

der den Standard-Ausgabestrom ersetzt, so dass alle nachfolgenden Anrufe an System.out auf den Strom gehen Sie angeben. Sie können dies tun, bevor Sie Ihre umschlossene Anwendung ausführen, z. System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("output.txt"))));

Wenn Sie einen Wrapper verwenden, den Sie nicht ändern können, erstellen Sie einen eigenen Wrapper. Sie haben also FEST Wrapper -> Stream Redirector Wrapper -> getestete App.

Zum Beispiel können Sie einen einfachen Wrapper wie folgt implementieren:

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); 
    } 
} 

Sie rufen Sie es mit 3 weiteren params - Hauptklasse zu laufen, und der Ausgang/Fehler lenkt.

+3

Und um klar zu sein, hat dies nichts mit Java selbst zu tun, sondern ist eine Standardfunktion, die von der Shell angeboten wird. –

+1

danke, ich habe meine Antwort aktualisiert, um das klarzustellen. – mdma

+0

Ich habe versucht, das zu tun, aber ich am Ende mit einer leeren TXT-Datei. Der Ausgang geht immer noch zum Terminal. Die Sache ist, dass ich eine helfende Klasse aus einer Testbibliothek namens FEST (http://fest.easytesting.org) verwende. Diese helfende Klasse akzeptiert Parameter, die sie dann an die App weitergeben kann. Der Stream-Redirector könnte hier nicht ganz passen – Omar

24

Ja Sie die gewünschte Datei wie folgen einstellen.

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

-1 für Druckstack Trace – artbristol

+0

@artbristol -1 wenn es einen leeren Block gab –

+0

Ich weiß, das ist ein sehr alter Thread Kann jemand bitte den Unterschied zwischen 'System.setOut (new PrintStream (neue Datei ("output-file.txt"))); 'und' new PrintStream (neuer BufferedOutputStream (neuer FileOutputStream ("output-file.txt")), "?" Warum sollte man sich über die anderen entscheiden? Entschuldigung wenn ich etwas naives frage, sehe ich jedoch keinen Unterschied.Ich verwende JDK8 –

7

Um "vijay.shad" Antwort, die ich den Code verwendet zu verbessern brüllt die Datei in dem Home-Verzeichnis in Linux oder MyDocuments in Windows zu lenken.

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

-1 für Print Stack Trace – artbristol

41

Wenn Sie diesen Konstruktor:

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

erinnern auf true setzen autoflushing, d.h .:

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

sonst können Sie leere Dateien erhalten auch nach dem Programm beendet.

+1

Netter Fangmann! – yhcowboy

+0

@ben [Es gibt ein Konstrukt r] (https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#PrintStream (java.io.OutputStream,% 20boolean)) auf PrintStream, das automatisches Flushing unterstützt. – heenenee

+0

@heenenee Ich sehe das. Allerdings bezog sich mein Kommentar auf einen Teil der Antwort, die nach dem Kommentar geändert wurde. Siehe auch den Bearbeitungsverlauf der Antwort. – ben

3

System.out.println() wird zum Drucken von Nachrichten auf der Konsole verwendet.

System ist eine Klasse, die im java.lang-Paket definiert ist. out ist eine Instanz von PrintStream, einem öffentlichen und statischen Mitglied der Klasse System. Da alle Instanzen der PrintStream-Klasse über eine öffentliche Methode println() verfügen.

System.out ist ein statischer PrintStream, der auf die Konsole schreibt. Wir können die Ausgabe mit der System.setOut() Methode, die einen PrintStream als Parameter verwendet, an einen anderen PrintStream umleiten.

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. 

Weitere Informationen finden Sie in meinem 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");