如何使用Java格式化控制台输出到文件?

时间:2017-12-20 06:57:26

标签: java file console format output

背景:您好!首先,请记住,我是Java的新手,因此,如果我有什么不对劲,请原谅我。我一直在尝试格式化我的控制台并将其输出保存为文本文件2天。到目前为止,这是我的代码:

我试图将控制台的格式设置为

  

[12/20/2017 23:55:30]节目(此处留言)

我这样做:

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 void progStream() throws FileNotFoundException {
        System.setOut(console);
        System.out.println("This is a test.");
    }

到目前为止,它工作得很好,我可以看到所有的系统输出都显示在eclipse的控制台上,格式正确。但是,当我尝试将其保存为文本文件时,它只保存消息。没有格式。

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

我尝试用System.out.println("message");替换console.print("message");,但我遇到了同样的问题。不幸的是,我已经用完了教程和论坛,我仍然无法找到解决方案。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

在您的代码中,您永远不会使用您创建的Format类来为输出添加日期。您应该已经创建了此类的实例,并调用新创建的实例的println()字段的方法console。下面是你的代码,略有修改,我想你做了你想做的事情:

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

  }

但我认为没有必要在PrintStream类内部有一个单独的字段,它是Format的后代并用于打印到。{1}}。类本身也可以从PrintStream下降。请看下面的代码:

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

  }

是的,请查看log4j和/或google查看java logging

答案 1 :(得分:0)

我认为这就是你想要实现的目标:

height:100vh;

PS。:如果你真的想记录东西,我建议你考虑像log4j这样的日志框架。

PS。 2: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 + ")"); } } 似乎不太好主意,因为您的standard output将被重定向到该文件。

我希望我的回答可以帮助你:)