【问题标题】:Difference between PrintWriter and FileWriter classPrintWriter 和 FileWriter 类的区别
【发布时间】:2012-12-13 14:53:27
【问题描述】:
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。

【问题讨论】:

标签: java file-io


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    虽然这两个内部都使用 FileOutputStream ,但主要区别在于 PrintWriter 提供了一些额外的格式化方法,例如 println 和 printf。

    代码 sn-ps:

    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. 如果出现任何 IO 故障,FileWriter 会抛出 IOException。
    2. 所有 PrintWriter 方法都不会抛出 IOException,而是设置一个布尔标志,可以使用 checkError() 获得。
    3. PrintWriter 带有一个在创建时自动刷新的选项(默认是没有自动刷新),它会在写入每个字节的数据后刷新。在 FileWriter 的情况下,调用者必须负责调用刷新。

    【讨论】:

    • 这是错误的:PrintWriter automatically invokes flush after every byte of data is written。您可以创建一个带有自动刷新的对象,但默认情况下是没有自动刷新的。 See here
    • @Math 我认为您将 PrintWriter 类与 PrintStream 类混淆了,因为在 PrintWriter 类中,如果在创建对象时请求自动刷新,那么它只会在 之一时完成println()、printf()、format() 方法被调用,但并非总是如此。
    • @Math 的观点是绝对正确的。 PrintWriter 可以使用 autoflush 进行实例化,但默认构造函数将其设置为 false(参见 Javadoc/源代码)。所以答案的第三点是误导IMO;它应该是“PrintWriter 可以被实例化为自动刷新...”。
    • 感谢您的意见。根据您的 cmets 更正了我的答案。
    • 你写的是which will flush after every byte of data is writte,但这是真的吗?调用println() 和类似方法时是否不执行自动刷新?那么它不一定是一个 byte 的数据:pw.println("Hello") 将包含几个将同时刷新的字节。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      从源上看,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));
      }
      

      这意味着第一个示例可能会更高效。但是我会使用File 而不使用FileWriter,因为对我来说它更简单。

      【讨论】:

      • 这是最好的答案。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 2013-01-05
        • 2011-08-11
        • 2021-08-06
        • 2012-09-03
        • 2012-10-23
        • 1970-01-01
        相关资源
        最近更新 更多