【问题标题】:how to use the same printwriter in multiple classes (java)如何在多个类中使用相同的打印机(java)
【发布时间】:2017-08-09 11:47:41
【问题描述】:

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

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

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

我在每个方法/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

代码确实向文件写入了一些内容,但它总是覆盖前一行。因此,例如,我只有 1 行,而不是 12 行“某事”。

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

这是我第一次处理文件。谢谢。

【问题讨论】:

  • 是的,问题是您在所有三个类中都创建了一个新的 PrintWriter。而不是这样做,您必须将其作为参数传递。例如:编写处理方法以接受 PrintWriter 作为参数,然后在 main 方法中创建单个 PrintWriter 实例,然后将三个方法调用放在其 try 块中。
  • @BalázsNemes,如果写操作不是并发的并且没有及时分离(即每个类都可以写,而不管其他三个类在做什么),那么为每个类创建自己的打印写入器实际上是可以的。跨度>
  • @M.Prokhorov 好的.. 那么如何避免覆盖?

标签: java file printwriter


【解决方案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.
}

【讨论】:

  • 非常感谢。这真的很有帮助! :)
【解决方案2】:

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

【讨论】:

  • 那么,public static PrintWriter 出来了吗?
  • @DanielBoksan,这实际上是一个非常糟糕的主意,因为没有一个类会知道何时关闭编写器,而且你自己会有一个很好的小资源泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2013-02-19
  • 2015-05-31
  • 1970-01-01
  • 2023-03-13
  • 2011-12-17
  • 2021-03-15
相关资源
最近更新 更多