【问题标题】:Difference between java.io.PrintWriter and java.io.BufferedWriter?java.io.PrintWriter 和 java.io.BufferedWriter 的区别?
【发布时间】:2010-12-17 08:25:12
【问题描述】:

请看下面的代码:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

这两种方法有什么区别?

我们什么时候应该使用 PrintWriter 而不是 BufferedWriter?

【问题讨论】:

    标签: java file stream filereader bufferedreader


    【解决方案1】:

    PrintWriter 提供了更多方法 (println),但需要注意的最重要(也是令人担忧)的区别是 它会吞下异常

    您可以稍后致电checkError 以查看是否发生了任何错误,但通常您会使用PrintWriter 来处理诸如写入控制台之类的事情 - 或者在您不这样做的“quick 'n dirty”应用程序中希望被异常所困扰(并且长期可靠性不是问题)。

    我不确定为什么“额外的格式化能力”和“不要吞下异常”这两个方面被捆绑到同一个类中 - 格式化在许多你的地方显然很有用希望吞下异常。很高兴看到BufferedWriter 在某个时候获得相同的能力...

    【讨论】:

    • @WindyFields:不,PrintStreamOutputStreamPrintWriterWriter
    • 谢谢。 “它吞没了例外。”你的意思是 PrintWriter 不会引发检查异常?未检查的异常呢?
    • @Ben:我专门讨论了IOException,因为其他所有 IO 抽象(ReaderWriter 等)都声明如果出现问题,它的方法会抛出 IOException - @ 987654334@ 没有。
    【解决方案2】:

    BufferedWriterPrintWriter 的 API 参考详细说明了区别。

    使用 PrintWriter 的主要原因是访问 printXXX 方法,如 println()。您基本上可以使用 PrintWriter 写入文件,就像使用 System.out 写入控制台一样。

    BufferedWriter 是一种写入文件(或其他任何东西)的有效方法,因为它会在(可能取决于实现)下降到 C 来写入文件之前缓冲 Java 内存中的字符。

    没有“PrintReader”这样的概念;最接近的可能是java.util.Scanner

    【讨论】:

    • @TritonMan 在某些时候需要与操作系统交互,这意味着要跳出 Java。
    • 但是 PrintWriter 也被缓冲了,对吧?因此,正如您的回答所暗示的那样,它们之间并没有真正的区别
    • PrintWriter 是缓冲的,但区别在于 print writer 具有的方法。我不认为我暗示了什么......
    • 您写的关于 BufferedWriter 的内容 - PrintWriter 是否也是如此?我仍然不清楚,因为我认为这个答案是关于差异
    【解决方案3】:

    正如 TofuBeer 的回答中所说,两者都有自己的特色。要充分利用 PrintWriter(或任何其他编写器)的优势,同时也使用缓冲写入,您可以将 BufferedWriter 包装为所需的,如下所示:

    PrintWriter writer = new PrintWriter(
                             new BufferedWriter (
                                 new FileWriter("somFile.txt")));
    

    【讨论】:

    • 记住@Jons 评论 PrintWriter 将吞下异常。应该调用 checkError。
    • 至少在当前的 openJDK 8 实现(可能还有旧版本)中,PrinterWriter 已经创建了一个BufferedWriter
    【解决方案4】:

    PrintWriter 只是在字符模式下公开任何 Writer 上的打印方法。

    根据其缓冲方法,BufferedWriter 比 更有效。 它带有一个 newLine() 方法,根据您的系统平台,可以正确操作文本文件。

    BufferedReader 允许从文件中读取文本,并将字节转换为字符。它允许逐行读取。

    没有PrintReader,你必须根据你输入的格式选择另一个Reader实现。

    【讨论】:

      【解决方案5】:

      PrintWriter 是将字符数据写入文件的增强型 Writer。

      PrintWriter 相对于 FileWriter 和 BufferedWriter 的主要优势在于:

      1. PrintWriter 可以直接与文件通信,也可以通过一些 Writer 对象进行通信。

      PrintWriter printwriter = new PrintWriter("blah.txt");

      (或)

      FileWriter filewriter = new FileWriter("blah.txt");
      PrintWriter printwiter = new PrintWriter(filewriter);
      
      1. 我们可以将任何类型的 Primitive 数据直接写入文件(因为我们有额外的 PrintWriter 方法的重载版本,即 print() 和 println())。

        printwriter.print(65); //65
        bufferedwriter.write(65); //A
        printwriter.println(true); //true

      【讨论】:

        【解决方案6】:

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

        注意:代码块中的文本内容会自动换行

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

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

        【讨论】:

          【解决方案7】:

          BufferedWriter - 将文本写入输出字符流,缓冲字符流中的字符。 PrintWriter - 将对象的格式化表示打印到文本输出流。

          【讨论】:

            【解决方案8】:

            我认为上面已经提到了使用 PrintWriter 背后的原因,但其中一个重要原因是您将文件对象直接传递给 PrintWriter 构造函数,这样使用起来很容易。

            File file=new File(“newfile.txt”);
            PrintWriter pw=new PrintWriter(file);
            

            【讨论】:

              猜你喜欢
              • 2020-06-24
              • 2013-08-07
              • 2011-10-20
              • 2020-01-23
              • 1970-01-01
              • 2014-10-09
              • 2010-12-21
              • 2011-05-11
              • 2014-01-24
              相关资源
              最近更新 更多