Java:将文本打印到Console或Text文件的优雅方式

时间:2011-09-11 10:37:15

标签: java

我有一个打印出一些文本输出的Java程序。实际上我的简单PrintOutput函数就像

System.out.println("some output");

但我想声明一个变量

printonfile = true

如果设置为true,则将输出打印到文本文件,如果设置为false,则输出到屏幕(控制台)。

如何将out分配给文件而不是System.out,以避免产生类似

的内容
 if (printonfile) {
   myfile.out("some output");
 }
 else {
   System.out.println("some output");
 }

有没有办法在我的函数开头声明一个“输出”变量,所以我可以为它分配标准输出(控制台)或文本文件?

由于

5 个答案:

答案 0 :(得分:10)

您已经描述了策略设计模式的典型用例。

创建一个界面Printer,制作2个实现ConsolePrinterFilePrinter,并根据您的情况使用正确的实现。

interface Printer {

   void print(String msg);
}

class ConsolePrinter implements Printer {

   public void print(String msg) {
      System.out.print(msg);
   }
}

class FilePrinter implements Printer {

   private final FileWriter fileWriter;

   public FilePrinter(File file) {
      this.fileWriter = new FileWriter(file); //here you should do some exceptions handling
   }

   public void print(String msg) {
      fileWriter.write(msg);   //here you should also care about exceptions
      fileWriter.flush();
   }
}

Printer chosenPrinter = printOnFile ? new FilePrinter(file) : new ConsolePrinter();
chosenPrinter.print("Hello");

答案 1 :(得分:3)

您可以这样做:

    PrintSream stream = printToFile ? 
                        new PrintStream(new File(filename)) 
                        : System.out;

现在,您可以在任何地方使用流而无需任何更改。

答案 2 :(得分:3)

查看logging library例如log4jjava.util.logging可以非常详细地控制输出。

答案 3 :(得分:2)

System类的out字段是PrintStream类的实例;您还可以构造一个输出到文件的PrintStream对象。因此,您设置输出位置的想法可以如下工作

PrintStream myOut = null;
// Decide output method somehow
if(...) {
  myOut = System.out;
}
else {
  myOut = new PrintStream(new File("/path/to/a/file"));
}

// Use the PrintStream to write a message
myOut.println("Hello World");

// Tidy up at end
myOut.close();

答案 4 :(得分:0)

如果时间正确设置需要一点时间,但如果你想要更好地/自定义记录你的警告,错误和一般信息,log4j绝对值得一试。