java.io.PrintWriter和java.io.BufferedWriter之间的区别?

i2i*_*eya 90 java file stream filereader bufferedreader

请查看下面的代码:

// 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);
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

什么时候应该在BufferedWriter上使用PrintWriter?

Jon*_*eet 84

PrintWriter给出了更多的方法(println),但要注意的最重要的(也是令人担忧的)差异是吞下异常.

您可以checkError稍后调用以查看是否发生了任何错误,但通常您可以使用PrintWriter诸如写入控制台之类的内容 - 或者在"快速'脏"应用程序中,您不希望被异常所困扰(以及长期可靠性不是问题).

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

  • @Ben:我专门讨论了 `IOException`,因为其他所有 IO 抽象(`Reader`、`Writer` 等)都声明,如果出现问题,它的方法会抛出 `IOException` - `PrintWriter` 不会。 (2认同)

Tof*_*eer 56

BufferedWriterPrintWriter的API参考详细说明了这些差异.

使用PrintWriter的主要原因是可以访问printXn()等printXXX方法.实际上,您可以使用PrintWriter写入文件,就像使用System.out写入控制台一样.

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

没有"PrintReader"这样的概念; 你得到的最接近的可能是java.util.Scanner.

  • @TritonMan在某些时候需要与操作系统进行交互,这意味着步入Java之外. (4认同)

Kai*_*ann 8

正如在TofuBeer所说,答案都有他们的专长.要充分利用PrintWriter(或任何其他编写器)但也使用缓冲写入,您可以将BufferedWriter包装为所需的一个,如下所示:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Run Code Online (Sandbox Code Playgroud)

  • 至少在当前的openJDK 8实现中(可能是旧版本),`PrinterWriter`已经创建了一个`BufferedWriter`. (4认同)
  • 记住@Jons评论PrintWriter将吞下异常.应该调用checkError. (2认同)

小智 7

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

根据缓冲方法,BufferedWriter比效率更高.它附带了一个newLine()方法,根据您的系统平台,可以正确地操作文本文件.

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

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