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

问题描述 投票:0回答:9

请查看以下代码:

// 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
9个回答
101
投票

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

您可以稍后调用

checkError
来查看是否发生了任何错误,但通常您会使用
PrintWriter
来执行诸如写入控制台之类的操作 - 或者在您不想这样做的“快速而肮脏”的应用程序中被异常所困扰(并且长期可靠性不是问题)。

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

BufferedWriter
在某个时候获得相同的能力......


71
投票

BufferedWriterPrintWriter 的 API 参考详细介绍了差异。

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

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

不存在“PrintReader”这样的概念;最接近的可能是 java.util.Scanner.


10
投票

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

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

7
投票

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

根据其缓冲方法,BufferedWriter 比 BufferedWriter 更高效。 它配备了 newLine() 方法,具体取决于您的系统平台,可以正确操作文本文件。

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

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


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. 我们可以将任何类型的原始数据直接写入文件(因为我们有 PrintWriter 方法的附加重载版本,即 print() 和 println())。

    printwriter.print(65); //65

    bufferedwriter.write(65); //A

    printwriter.println(true); //true


3
投票

一般来说,Writer 会立即将其输出发送到底层字符或字节流。除非需要提示输出,否则建议将 BufferedWriter 包装在任何 write() 操作可能成本较高的 Writer 周围,例如 FileWriters 和 OutputStreamWriters。例如,

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

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

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


0
投票

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


0
投票

FileWriter 和 BufferedWriter 需要为每一行添加一个新的行分隔符,想象一下必须写入 100 行,而 PrintWriter 有 println() 方法可以做到这一点。最重要的是,FileWriter 和 BufferedWriter 只能写入 char 和 String 数据类型,而 PrintWriter 还可以写入 int、double 和 boolean 数据类型


-1
投票

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

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
© www.soinside.com 2019 - 2024. All rights reserved.