使用FilerReader Java读取后,文件内容将被删除

时间:2017-04-13 10:13:55

标签: java bufferedreader

最近我正在进行代码审查,代码是这样的:

File j = new File(aFile);
System.out.println(j.length());
BufferedReader fileReader = new BufferedReader(new FileReader(j));
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
System.out.println(j.length());

我有两个问题:

  1. jaFile的副本,因为我看过其他复制文件的大方法,例如here

  2. 第一个System.out.println()打印32,第二个,在创建文件阅读器后,打印0。那么,为什么内容会被删除?有人能解释一下这里发生了什么吗?

  3. 我把那些System.out.println()语句检查文件是否为空。

    解决方案:

    阅读完答案后,我想我发现代码有什么问题。如果j只是一个引用,那么fileWriter正在尝试写入同一个文件并且它是循环的。我在这儿吗?

    编辑:这不是建议问题的重复,因为整个混淆是认为jaFile的克隆或重复。

3 个答案:

答案 0 :(得分:0)

1)j不是重复的,它是对包装实际文件的新文件对象的引用。

2)此代码无法删除(甚至更改)文件。还有更多的代码吗?

答案 1 :(得分:0)

你没有向我们展示一切,是吗?

显示的代码肯定不会更改或删除文件,正如您所使用的类的名称所示:BufferedReaderFileReader(注意 Reader 两者中。)

我认为创建读者后某些操作系统可能会锁定文件的可能性很小,因此甚至不允许File对象再次读取length()属性。但是,我无法在任何地方找到记录或报告,所以我非常怀疑它。

我运行了以下代码,其中test是包含0123456789(长度10)的纯文本文件:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class StackOverflow {
    public static void main(String[] args) {
        File f = new File("test");
        System.out.println("Length before: " + f.length());
        try {
            BufferedReader fileReader = new BufferedReader(new FileReader(f));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("Length after: " + f.length());
    }
}

<强>结果

Length before: 10
Length after: 10

因此,我怀疑问题出在其他地方。

修改

现在OP更新了问题,我们终于有了相关的一行:

BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());

这就是文件为空的原因及其长度0FileWriter将打开文件进行写入并覆盖现有内容(如果有)。你可以通过传入第二个参数来防止这种情况,使用another constructor of FileWriter,一个接受append标志的参数:

public FileWriter(String fileName, boolean append) throws IOException 
public FileWriter(File file, boolean append) throws IOException
  

在给定File对象/名称的情况下构造FileWriter对象。如果第二个参数为true,则字节将写入文件的末尾而不是开头。

换句话说,如果您不想覆盖内容,请将以上行更改为:

BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath(), true);

答案 2 :(得分:0)

  

1)j是aFile的副本,因为我已经看到了其他复制文件的巨大方法,比如这里和这里。

它是FileaFile构造的对象,无论可能是什么。这个过程与复制文件没有任何关系,无论是巨大的还是巨大的。 File只包装文件名称。不是它的内容。您的第一个链接与复制文件无关。

  

2)第一个结果打印32,第二个结果在创建文件读取器后打印0.因此,为什么内容会被删除?

显然这不是真正的代码。真正的考验是fileReader.read()是否立即返回-1。