PrintWriter类和FileWriter类的区别

11
try{

    File file = new File("write.txt");
    FileWriter writer = new FileWriter(file);

    PrintWriter printWriter = new PrintWriter(writer);
    printWriter.println("pqr");
    printWriter.println("jkl");
    printWriter.close();

    PrintWriter printWriter = new PrintWriter(file);
    printWriter.println("abc");
    printWriter.println("xyz");
    printWriter.close();
}

我不明白这两种方式的区别。在什么情况下我应该使用printWriter和fileWriter。


请在stackoverflow上寻找已经回答的问题……https://dev59.com/F2025IYBdhLWcg3w25yy - Prateek
那个问题与此处提出的问题不同。 - Manu
5个回答

10
虽然这两者都内部使用 FileOutputStream ,但主要区别在于 PrintWriter 提供了一些附加的格式化方法,例如 println 和 printf。
代码片段:
public PrintWriter(File file) throws FileNotFoundException {
     this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
     false);
}


public FileWriter(File file) throws IOException {
       super(new FileOutputStream(file));
}

主要区别:

  1. FileWriter在发生任何IO故障时会抛出IOException。
  2. PrintWriter的所有方法都不会抛出IOException,而是设置一个布尔标志,可以使用checkError()获取。
  3. 创建PrintWriter时,它具有自动刷新选项(默认情况下不带自动刷新),它将在写入每个字节数据后自动刷新。对于FileWriter,调用者必须负责调用flush。

2
这是错误的:PrintWriter在每个数据字节被写入后自动调用flush。您可以创建一个带有自动刷新的对象,但默认情况下是没有自动刷新的。请参见此处 - Math
1
@Math 我认为你把PrintWriter类和PrintStream类搞混了,因为在PrintWriter类中,如果在对象创建时请求自动刷新,则仅在调用println()、printf()、format()方法之一时才会执行刷新,而不是总是执行。 - sactiw
1
@Math的观点是完全正确的。PrintWriter可以使用autoflush实例化,但默认构造函数将其设置为false(请参阅Javadoc /源代码)。因此,在我看来,答案的第三点是误导性的;它应该写成“PrintWriter可以被实例化为自动刷新...”。 - mrod
感谢您的回复。根据您的评论,我已经更正了我的答案。 - Rahul
你写的是“每写入一个字节就刷新”,但这是真的吗?当调用println()和类似的方法时,不是会自动执行自动刷新吗?那么它不一定是字节数据:pw.println("Hello")将包含多个字节,这些字节将一次性被刷新。 - parsecer
在问题的摘录中,PrintWriter(File)和PrintWriter(FileWriter(File))有什么区别? - Manu

2

当你传递一个文件时,PrintWriter的作用是以缓冲方式打开它。

public PrintWriter(File file) throws FileNotFoundException {
    this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))),
         false);
}

如果您传递一个 FileWriter,它将打开它,不会缓冲
public FileWriter(File file) throws IOException {
    super(new FileOutputStream(file));
}

这意味着第一个例子可能会稍微更有效率一些。然而,我会使用没有 FileWriterFile,因为对我来说更简单。


1
这是最好的答案。 - johnny

1

PrintWriter 提供了一些方便的格式化方法,如 printlnprintf。因此,如果您需要编写打印文本,可以使用它。 FileWriter 更像是“低级”写入器,只能让您编写字符串和字符数组。基本上,我认为您选择什么并没有太大区别。


0

虽然FileWriter只有基本的一组方法,但PrintWriter具有丰富的便利方法之一是在您的示例中 - PrintWriter.println

您还应该记住,“此类中的方法从不引发I / O异常,尽管其中一些构造函数可能会。客户端可以通过调用checkError()来查询是否发生任何错误”


0

两者之间最重要的区别之一是,使用FileWriter可以将文本追加到现有文件的末尾,而使用PrintWriter则不行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接