【问题标题】:FileWrite BufferedWriter and PrintWriter combinedFileWrite BufferedWriter 和 PrintWriter 组合
【发布时间】:2013-03-26 01:31:33
【问题描述】:

好的,我正在学习 I/O,我在其中一张幻灯片中找到了以下代码。有人可以解释一下为什么需要 FileWrite、BufferedWriter 和 PrintWriter 吗?我知道 BufferedWriter 是缓冲输出并一次将其全部放入,但他们为什么要使用 FileWriter 和 PrintWriter 呢?他们在错误处理等方面有一点不同吗?

还有为什么他们将bw 传递给PrintWriter

      FileWriter fw = new FileWriter (file);
      BufferedWriter bw = new BufferedWriter (fw);
      PrintWriter outFile = new PrintWriter (bw);

【问题讨论】:

    标签: java filewriter printwriter bufferedwriter


    【解决方案1】:

    通常,这种 Writer 链接是关于抽象的。 PrintWriter 有一些有用的 printprintln 方法,如果您想将字符串和行打印到文件中,它们会很方便。直接使用FileWriter,您将不得不使用更“低级”的API。正如你所说,BufferedWriter 是关于缓冲的。因此,这基本上是您想要输出到文件的内容以及您喜欢哪种抽象级别的问题。

    【讨论】:

      【解决方案2】:

      FileWriter 只是编写纯文本(没有格式化),它不使用任何缓冲机制,无论它以何种方式写入。

      BufferedWriterWriter 类的包装器,使其能够使用缓冲区功能(以优化 IO)。

      PrintWriter 打印格式化文本,您可以提供格式字符串以及要打印的数据,虽然它可以直接与任何Writer/OutputStream 一起使用,只是为了提供缓冲,Writer/OutputStream 第一次传递给BufferedWriter 然后将格式化文本传递给PrintWriter

      【讨论】:

        【解决方案3】:

        大概他们使用FileWriter 是因为他们想写入文件。 BufferedWriterPrintWriter 都必须指定另一个作者来写信——你需要一些最终目的地。

        (我个人不喜欢FileWriter,因为它不允许您指定编码。我更喜欢使用包裹在OutputStreamWriter 中的FileOutputStream,但那是另一回事。)

        BufferedWriter 用于缓冲,正如您所说 - 虽然它不缓冲 all 输出,只是固定数量的输出(缓冲区的大小)。它为底层写入器创建“更粗”的写入。

        至于PrintWriter 的使用——好吧,这暴露了一些额外的方法,例如println。就我个人而言,我不喜欢它,因为它会吞下异常(您必须使用checkError 明确检查,它仍然没有提供详细信息,而且我认为我曾经见过使用它),但是再次,这取决于你在做什么。 PrintWriter 作为 its 目标传递给 BufferedWriter

        因此,您显示的部分下方的代码可能会写入PrintWriter,后者将写入BufferedWriter,后者将(当其缓冲区已满,或者刷新或关闭时)写入@ 987654335@,然后将字符数据转换为磁盘上的字节。

        【讨论】:

        • 您是说将 BufferedWriter 传递给 PrintWriter。真的需要吗? PrintWriter 本身是缓冲的。尝试在不冲洗的情况下打印。
        • @Rollerball:我是说 OP 正在 这样做。 BufferedWriter 很可能是无关紧要的。
        • @Rollerball if you don't pass BufferedWriter to PrintWriter docs声明“ ..没有缓冲,每次调用 print() 方法都会导致字符转换为字节然后立即写入文件,这可能非常低效......”
        • @Jon 感谢您指出好的替代方案(例如 FileOutputStream 和 OutputStreamWriter)。我很久没用过 PrintWriter 但我不知道 checkError!
        【解决方案4】:

        来自Docs

        通常,Writer 将其输出立即发送到底层字符或字节流。除非需要快速输出,否则建议将 BufferedWriter 包装在任何 write() 操作可能成本高昂的 Writer 周围,例如 FileWriters 和 OutputStreamWriters。例如,

         PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
        

        会将 PrintWriter 的输出缓冲到文件中。如果没有缓冲,每次调用 print() 方法都会导致字符转换为字节,然后立即写入文件,这可能非常低效。

        您可以从中了解到BufferedWriter 是一种高效的写东西的方式。

        将文本写入字符输出流,缓冲字符,以便高效写入单个字符、数组和字符串。

        FileWriter 对象被传递给BufferedWriter,因为这里的目的是使用BufferedWriter 写入某个输出文件。

        最后,PrintWriter 用于print* 方法,如println()

        【讨论】:

          【解决方案5】:

          对象按此顺序包装,因为您想使用最外层的 PrintWriter 进行更复杂的格式化。 BufferedWriter 必须包裹在某些东西上。因此,FileWriter 是 BufferedWriter 包装的,是最里面的对象。

          【讨论】:

            【解决方案6】:

            来自here的PrintWriter

            将对象的格式化表示打印到文本输出流。 此类实现了 PrintStream 中的所有打印方法。 它不包含写入原始字节的方法,程序 应该使用未编码的字节流。

            从上面的陈述看来,使用 PrintWriter 的主要原因是为了获得PrintStream 的所有方法的访问权限,例如println()println(char [] x) 等。

            BufferedWriter,你说得对,这是写入文件的最佳方式之一,因为它会在直接写入文件之前将字符缓冲到虚拟内存中,并提出了newLine() 方法。

            来自here的FileWriter

            FileWriter 用于写入字符流。写作用 原始字节流,考虑使用 FileOutputStream

            .

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-02-10
              • 1970-01-01
              • 1970-01-01
              • 2014-01-23
              • 2023-04-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多