【问题标题】:Only One FileWriter Instance per BufferedWriter Instance?每个 BufferedWriter 实例只有一个 FileWriter 实例?
【发布时间】:2016-06-11 23:21:44
【问题描述】:

我正在为 Java 项目创建文件写入/读取实用程序。我创建了一个类,它封装了特定文件的一般读取、写入等类型的函数。将使用此文件实用程序的类是多线程的。在该类内部,我有一个FileWriter(和FileReader)对象的实例变量。它在这个类的构造中被初始化。在每个写入方法中,我创建了一个 BufferedWriter 对象的新实例,以将 FileWriter 实例传递给。有什么理由我不应该这样做吗?每个BufferedWriter 实例是否需要唯一的FileWriter 实例?或者我可以在许多不同的BufferedWriter 实例中使用相同的FileWrite 实例吗?

【问题讨论】:

    标签: java multithreading file io bufferedwriter


    【解决方案1】:

    我无法想象你为什么认为你需要这个,但你不需要。你应该做的是在FileWriter周围创建一个singleBufferedWriter,然后让你的方法写入它,当然要同步。

    多个BufferedWriters 的众多问题之一是,如果您关闭其中任何一个,底层的FileWriter 也会被关闭。

    【讨论】:

    • 我看到“需要”这样做的原因是为了减少重复代码的数量。
    • 什么重复代码? bufferedWriter.write()? 事实是您会添加重复代码,特别是new BufferedWriter(...) 无处不在。
    【解决方案2】:

    使用 BufferedWriter 的全部意义在于缓冲数据以最小化系统调用的次数。这样做是为了提高效率,但它通过延迟/批量写入它包装的 Writer 来工作。

    总之,

    • 它的目的是提高性能
    • 它的缺点是您写入的内容不会立即写入,如果操作不正确,则永远不会。

    创建多个 BufferedWriter 是最糟糕的事情,因为;

    • 它的创建成本很高,默认情况下缓冲区为 8 KB。经常这样做,这很容易比没有缓冲区更糟糕。
    • 如果您不刷新数据,缓冲的任何内容都可能丢失,或者如果您同时有多个缓冲区,则可以按任意顺序写入它们。这是破坏文件的好方法。同样,最好不要使用缓冲区。

    Writer(或任何类)不像您为了让代码变得更好而洒在周围的仙尘。它是有目的的,只有在你知道它有帮助时才应该添加它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多