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

how to use the same printwriter in multiple classes (java)

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

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

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

我在每个 method/if 块的末尾都使用了这段代码

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 行 "something" 我只有 1.

我该如何解决这个问题?我怀疑这是因为我每次都创建一个新的 PrintWriter 并考虑过在其他地方声明它并调用它给每个 class。那行得通吗?我将如何为每个 class 调用它?

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

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

您用来创建 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();
}

关于每个 class 创建自己的 PrintWriter 还有一些话要说:

  • 它重复了逻辑
  • 它(可能不必要地)将您的 class 所做的任何操作与输出操作特别绑定到一个文件中(如果您想改为通过 http 写入怎么办?)
  • 打开文件的操作通常不便宜,所以你在那里失去了性能

我建议与其每个 class 创建自己的输出设施,不如从外部接收一个:

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.
}