【问题标题】:FileWriter object reference not being overwritten as expectedFileWriter 对象引用未按预期被覆盖
【发布时间】:2016-02-20 05:44:55
【问题描述】:

我正在和一个同事一起做一个简单的编码练习,我们偶然发现了这个问题。

程序要求概述了如果第三个命令行参数是“a”,则输出文件应附加,而不是替换。

所以,他的代码是这样的:

import java.io.FileWriter;
import java.io.IOException;

public class MyFileWriter {
   public static void main(String[] args) {
       //...
      try {
         FileWriter fw = new FileWriter("testfile");

         if(args[2].equals("a")) {
            fw = new FileWriter("testfile", true);
         } 
         else if(args[2].equals("r")) {
            fw = new FileWriter("testfile");
         }
      } 
      catch(IOException e) {
         System.out.println(e.getMessage());
      }

   }
}

我知道在 if 语句之前初始化 FileWriter 是多余的,但这就是它的设置方式。我们使用第三个命令行参数“a”运行它,并且 if 语句运行成功。但是,FileWriter 对象并未按预期附加到文件中。

我们将FileWriter 的初始声明更改为以下内容:

FileWriter fw = null;

然后它起作用了。我认为它必须是某种引用或指针问题,但为什么呢?从理论上讲,赋值运算符应该覆盖事物所指向的任何值,因此即使初始化它开始是多余的,它也应该完全覆盖对象。

有人知道为什么这是个问题吗?我只是好奇。

【问题讨论】:

  • 因为new FileWriter("testfile"); 会立即覆盖该文件,即使它存在并替换为一个空文件。

标签: java pointers reference filewriter


【解决方案1】:

我认为这一定是某种引用或指针问题,但为什么呢?

不,这是您的代码流以及如何调用FileWriter() 构造函数的问题。

第一次调用FileWriter() in

try {
     FileWriter fw = new FileWriter("testfile");
     ....

已经覆盖并清除了文件,然后再创建另一个 FileWriter 用于附加到它:

...
if(args[2].equals("a")) {
    fw = new FileWriter("testfile", true);   // here, "testfile" was already overwritten
}
...

因此,您实际上是在附加到一个空文件。

请记住,构造函数可以包含任何类型的程序代码。您甚至不必将构造函数调用的“结果”分配给变量 - 以下内容与覆盖文件的效果相同:

...
new FileWriter("testfile");
....

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多