如何在多个类中使用相同的printwriter(java)

时间:2017-08-09 11:47:41

标签: java file printwriter

我正在开发一个小程序,它要求我从文件中读取一组参数,在3个类中对它们执行一些if else操作(所有3个类都继承相同的父类)。在每次操作之后,该方法应该在输出文件中打印一行,如

方法1的输出1 方法2的输出1 方法1的输出2 方法1等的输出3

这个想法是所有3个类的所有方法都应该打印在同一个文件中,顺序并不重要。

我在每个方法的末尾使用了这个代码/ if block

if/method {
.... do something
 text ="output of something";
    try(PrintWriter out = new PrintWriter("outputfile.txt")  ){
        out.println(text);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
  }//end if/method

代码确实会向文件写入内容,但它总是会覆盖前一行。因此,不要使用例如12行"某些东西"我只有1。

我该如何解决这个问题?我怀疑它是因为我每次都会创建一个新的PrintWriter,并考虑在其他地方声明它并将其调用到每个类。那会有用吗?我怎么去打电话给每个班级?

这是我第一次使用文件。谢谢。

2 个答案:

答案 0 :(得分:1)

您用于创建PrintWriter的构造函数在内部使用FileOutputStream的新实例。

FileOutputStream有两个通用的写模型:

  • 覆盖(默认)
  • 追加

由于您未指定要使用的模式,因此您的编写器将使用默认模式。要告诉它您需要哪种模式,您需要使用正确的模式创建FileOutputStream。例如,像这样:

try(PrintWriter out = new PrintWriter(new FileOutputStream("outputfile.txt", true))) {
// note the boolean parameter in FileOS constructor above. Its "true" value means "Append"
    out.println(text);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

关于每个创建自己的PrintWriter的类,还有一些要说的内容:

  • 它复制了逻辑
  • 它(可能是不必要的)将你的课所做的任何事情与输出操作特别联系到一个文件中(如果你想通过http写什么呢?)
  • 打开文件的操作通常不便宜,所以你在那里失去了性能

我建议不要每个类创建自己的输出工具,而应该从外部接收一个:

class MyClass {
  public void outputTo(PrintWriter w) {
    String text = ...
    w.println(text);
  }
}

and you use it like this:

try (FileOutputStream fos = new FileOutputStream("filename", append);
     PrintWriter w = new PrintWriter(fos)) {
  new MyClass().outputTo(w); // first instance
  new MyClass().outputTo(w); // second instance
  //... etc.
}

答案 1 :(得分:0)

尝试将PrintWriter声明为父类的静态变量,并根据需要在子类中使用它。