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


94

请浏览以下代码:

// 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);

这两种方法有什么区别?

我们何时应该在BufferedWriter上使用PrintWriter?

Answers:


61

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

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

BufferedWriter是一种写入文件(或其他任何文件)的有效方式,因为它将在放置到C进行写入文件之前(可能取决于实现方式)在Java内存中缓冲字符。

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


4
@TritonMan有时需要与OS进行交互,这意味着需要脱离Java。
TofuBeer

89

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

您可以checkError稍后致电以查看是否发生了任何错误,但是通常您会PrintWriter用于诸如写入控制台之类的操作-或在“快速而肮脏的”应用程序中,这些应用程序不希望被异常困扰(以及长期可靠性不是问题)。

我不知道为什么“额外格式的能力”和“请勿吞食例外”方面都捆绑到同一个类-格式化在很多地方,你显然有用希望异常被吞噬。很高兴BufferedWriter能在某个时候看到相同的能力...


@WindyFields:不,PrintStream是一个OutputStreamPrintWriter是一个Writer
乔恩·斯基特

谢谢。“它吞没了例外。” 您是说PrintWriter不引发检查异常吗?未经检查的exepitons怎么样?

@Ben:我是专门在谈论IOException,因为其他所有IO抽象(ReaderWriter等等)都声明IOException如果出现问题,PrintWriter则抛出其方法- 不会。
乔恩·斯凯特

8

正如TofuBeer在回答中所说,两者都有其特长。为了充分利用PrintWriter(或任何其他作家)的优势,而且还使用缓冲写入,可以将BufferedWriter与所需的包装在一起,如下所示:

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

2
记住@Jons的评论说PrintWriter会吞下异常。应该调用checkError。
MadMurf

1
我喜欢皇家Tenenbaums
Ogen 2014年

4
至少在当前的openJDK 8实现(可能是较旧的版本)中,PrinterWriter已经创建了BufferedWriter
nimrodm '16

7

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

根据其缓冲方法,BufferedWriter比效率更高。根据系统平台的不同,它带有newLine()方法,可以正确处理文本文件。

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

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


3

PrintWriter是将Character数据写入文件的功能最强大的Writer。

与FileWriter和BufferedWriter相比,PrintWriter的主要优点是:

  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


2

通常,Writer立即将其输出发送到基础字符或字节流。除非需要及时输出,否则建议将BufferedWriter包装在其write()操作可能会很昂贵的所有Writer周围,例如FileWriters和OutputStreamWriters。例如,

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

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

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


0

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


-1

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

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.