100

请看下面的代码:

// 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?

4

8 回答 8

97

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

您可以checkError稍后调用以查看是否发生了任何错误,但通常您会使用PrintWriter诸如写入控制台之类的事情 - 或者在您不想被异常打扰的“快速'n脏”应用程序中(以及在哪里长期可靠性不是问题)。

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

于 2009-11-17T07:04:06.307 回答
69

BufferedWriterPrintWriter的 API 参考详细说明了差异。

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

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

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

于 2009-11-17T06:57:37.057 回答
8

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

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
于 2009-11-17T07:07:32.983 回答
7

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

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

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

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

于 2009-11-17T07:15:35.850 回答
4

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

于 2018-09-20T21:33:00.100 回答
3

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

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

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

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

于 2014-06-13T10:23:26.977 回答
0

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

于 2017-05-15T12:22:20.687 回答
-1

我认为上面已经提到了使用 PrintWriter 背后的原因,但重要的原因之一是您将文件对象直接传递给 PrintWriter 构造函数,这使得它易于使用。

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
于 2014-01-20T07:01:12.073 回答