【问题标题】:java - Does FileWriter use a buffer? (it acts like it does in my example)java - FileWriter 是否使用缓冲区? (它的行为就像在我的例子中一样)
【发布时间】:2011-08-31 18:30:27
【问题描述】:


我正在使用 FileWriter,但我注意到了奇怪的行为。 我自己缓冲我的收藏和我使用的每 x 行

 IOUtils.writelines(myList,"\n", writer );

它不写入文件。我继续用更多行调用它,只有在它非常满之后才会写入文件。
它使用缓冲区吗?我在它的文档中找不到它。

【问题讨论】:

    标签: java filewriter


    【解决方案1】:

    the FileWriter class overview第二句说:

    这个类的构造函数假定默认的字符编码和默认的字节缓冲区大小是可以接受的。要自己指定这些值,请在 FileOutputStream 上构造一个 OutputStreamWriter。

    (我的重点)

    很明显它是缓冲的(除非默认的字节缓冲区大小为零,而且它们的措辞很奇怪)。

    我怀疑它只是在FileOutputStream 上使用OutputStreamWriter。看着OutputStreamWriter

    每次调用 write() 方法都会导致对给定字符调用编码转换器。 生成的字节在写入底层输出流之前会累积在缓冲区中。

    (我的重点)

    如果您想确保刷新各个级别的各种缓冲区,请尽可能使用flush method

    【讨论】:

    • 感谢您的详细回答。
    • @user:别担心,希望对您有所帮助。
    • 感谢您指出这一点。我在文档中也错过了它,当tail 没有显示我的文章时,我真的很困惑!
    【解决方案2】:

    我怀疑这是一个实现细节,但我希望大多数实现都使用缓冲区,是的。您当然不应该依赖它是无缓冲的。当您刷新或关闭写入器时,应该没问题。

    请注意,我个人不喜欢使用 FileWriter,因为它不允许您指定字符编码 - 我通常会将 FileOutputStream 包装在 OutputStreamWriter 中。

    【讨论】:

      【解决方案3】:

      查看课程sun.nio.cs.StreamEncoder.CharsetSE.implWrite()。 它使用 ByteBuffer

      StreamEncoder.CharsetSE 类由 OutputStreamWriter 内部使用,而后者又由 FileWriter 内部使用。

      【讨论】:

        【解决方案4】:

        似乎它使用缓冲区,但以其他方式(低级,缓冲区默认为空)。需要用 BufferedWriter 包装。来自 BufferedWriter javadoc

        "In general, a Writer sends its output immediately to the underlying
         character or byte stream.  Unless prompt output is required, it is advisable
         to wrap a BufferedWriter around any Writer whose write() operations may be
          costly, such as FileWriters and OutputStreamWriters.  For example,
        
          <pre>
          PrintWriter out
            = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
          </pre>"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-08
          • 1970-01-01
          • 2011-05-15
          • 1970-01-01
          • 2019-05-03
          • 1970-01-01
          • 2017-08-27
          • 1970-01-01
          相关资源
          最近更新 更多