2017-12-20 20 views
0

Hintergrund: Hallo! Bitte denken Sie daran, dass ich in Java ziemlich neu bin, also vergib mir, wenn ich etwas falsch gemacht habe. Ich habe versucht, meine Konsole zu formatieren und ihre Ausgabe für 2 Tage in eine Textdatei zu speichern. Hier ist mein Code so weit:Wie formatieren und speichern Sie die Konsolenausgabe in einer Datei in Java?

Ich versuche, das Format der Konsole

[2017.12.20 23.55.30] Programm zu setzen (Meldung hier)

und ich bin es, wie dies zu tun:

public class Format { 
    private static final DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

    PrintStream console = new PrintStream(System.out) { 

     public void println(String x) { 
      Date date = new Date(); 
      super.println("[" + sdf.format(date) + "] " + "program(" + x + ")"); 
     } 
    }; 

Zusammen mit diesem:

public void progStream() throws FileNotFoundException { 
     System.setOut(console); 
     System.out.println("This is a test."); 
    } 

Bis hier funktioniert es gut und ich kann sehen, dass alle Systemausgaben auf der Eclipse-Konsole mit dem richtigen Format angezeigt werden. Wenn ich jedoch versuche, eine Textdatei zu speichern, wird nur die Nachricht gespeichert. Ohne das Format.

public void progStream() throws FileNotFoundException { 
     File log = new File("log" + System.currentTimeMillis() + ".txt"); 
     FileOutputStream fos = new FileOutputStream(log); 
     PrintStream console = new PrintStream(fos); 
     System.setOut(console); 
     System.out.println("This is a test."); 
    } 

Ich habe versucht, System.out.println("message"); mit console.print("message"); ersetzen aber ich habe das gleiche Problem. Leider habe ich keine Tutorials und Foren mehr, um nachzusehen, und ich kann immer noch keine Lösung finden. Danke für Ihre Hilfe.

+0

Verwenden Sie eine Protokollierungs-API, es ist eine in der Kern-API eingebaut oder Sie könnten etwas 'Log4j' verwenden – MadProgrammer

+0

Können Sie versuchen, einen einfachen ganzen Code zu veröffentlichen, wie teilweise Codes sind sehr verwirrend zu verstehen –

Antwort

1

In Ihrem Code :), die Sie nie das Format-Klasse verwenden Sie die Ausgabe mit dem Datum vorangestellt wird erstellt. Sie sollten eine Instanz dieser Klasse erstellt haben und die Methode println() des Felds console der neu erstellten Instanz aufrufen. Im Folgenden finden Sie den Code, leicht modifiziert, dass ich glaube, das tut, was Sie wollen:

import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.io.FileOutputStream; 
    import java.io.PrintStream; 
    import java.text.DateFormat; 
    import java.text.SimpleDateFormat; 
    import java.util.Date; 

    public class So_47900381 { 

    static public class Format { 
     private static final DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
     PrintStream console = new PrintStream(System.out) {; 
     public void println(String x) { 
      Date date = new Date(); 
      super.println("[" + sdf.format(date) + "] " + "program(" + x + ")"); 
     } 
     }; 
    } 

    public static void progStream() throws FileNotFoundException { 
     File log = new File("log" + System.currentTimeMillis() + ".txt"); 
     PrintStream console = new PrintStream(new FileOutputStream(log)); 
     System.out.println("Writing to " + log.getPath()); 
     System.setOut(console); 
     Format fmt = new Format(); 
     fmt.console.println("This is a test."); 
    } 

    public static void main(String[] args) { 
     try { 
     progStream(); 
     } catch (Exception x) { x.printStackTrace(); } 
    } 

    } 

Aber ich denke, es gibt keine Notwendigkeit ein eigenes Feld haben, ist, dass ein Nachkomme des PrintStream und zum Drucken verwendet wird, innerhalb der Format Klasse. Die Klasse selbst könnte ebenfalls von der PrintStream abstammen. Schauen Sie sich den folgenden Code:

import java.io.File; 
    import java.io.FileNotFoundException; 
    import java.io.PrintStream; 
    import java.text.DateFormat; 
    import java.text.SimpleDateFormat; 
    import java.util.Date; 

    public class So_47900381_1{ 

    static public class Format extends PrintStream { 
     private static final DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

     public Format(File file) throws FileNotFoundException { 
     super(file); 
     System.setOut(this); 
     } 

     public void println(String x) { 
     Date date = new Date(); 
     super.println("[" + sdf.format(date) + "] " + "program(" + x + ")"); 
     } 
    } 

    public static void progStream() throws FileNotFoundException { 
     File log = new File("log" + System.currentTimeMillis() + ".txt"); 
     System.out.println("Writing to " + log.getPath()); 
     Format fmt = new Format(log);   // redirects the output to the file 
     System.out.println("This is a test."); // now it's written to the file 
    } 

    public static void main(String[] args) { 
     try { 
     progStream(); 
     } catch (Exception x) { x.printStackTrace(); } 
    } 

    } 

Und ja, sehen Sie die log4j und/oder Google für java logging.

+0

Danke, das ist wirklich hilfreich.Ich habe ungefähr ein oder zwei Wochen mit Java gearbeitet, also ist das alles neu für mich. Ihre Antwort wird sehr geschätzt. –

+0

@DavidMorales :) Dann markieren Sie es als akzeptiert :) Und beachten Sie, dass ich es ein wenig geändert habe - 'System.out.println (" Dies ist ein Test. ")' In der letzteren Schnipsel –

0

Ich denke, das ist, was Sie erreichen wollen:

import java.lang.*; 
import java.io.*; 
import java.util.*; 
import java.text.*; 

public class HelloWorld { 

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

    PrintStream console = new PrintStream(System.out); 
    PrintStream file = new PrintStream(new FileOutputStream(new File("log" + System.currentTimeMillis() + ".txt"))); 

    Format format = new Format(); 

    // console 
    format.print("bla", console); 

    // file 
    format.print("bla", file); 
    } 
} 

public class Format { 

    private static final DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

    public void print(String x, PrintStream stream) { 
    Date date = new Date(); 
    stream.println("[" + sdf.format(date) + "] " + "program(" + x + ")"); 
    } 

} 

PS .: Wenn Sie wirklich wollen die Dinge anmelden, empfehle ich Ihnen ein Logging-Framework wie log4j zu berücksichtigen.

PS. 2: System.setOut(stream) scheint keine gute Idee, da Ihre standard output wird in die Datei umgeleitet werden.

Ich hoffe, meine Antwort hilft Ihnen

+0

Vielen Dank! Es funktionierte. Das Beste ist, dass ich tatsächlich verstanden habe, was ich falsch mache. Ich werde über Logging Frameworks lesen, danke für die Referenz! –

+0

Schön kann ich helfen :) – BrunoJCM

Verwandte Themen