使用FilerReader Java读取后删除的文件内容

使用FilerReader Java读取后删除的文件内容,java,bufferedreader,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

最近我在做一个代码审查,代码如下:

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());
我有两个问题:

j是aFile的复制品,因为我见过其他复制文件的巨大方法,比如

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

我使用那些System.out.println语句来检查文件是否为空

解决方案:

在阅读了答案之后,我想我发现了代码的错误。如果j只是一个引用,那么fileWriter试图写入同一个文件,并且它是循环的。我就在这里吗

编辑:这不是建议问题的副本,因为整个混乱都认为j是文件的克隆或副本。

1 j不是副本,它是对包装实际文件的新文件对象的引用

2此代码不可能删除甚至更改文件。还有代码吗?

你没有向我们展示所有东西,是吗

所提供的代码肯定不会更改或删除文件,正如您正在使用的类的名称所示:BufferedReader、FileReader和note Reader

我认为在创建读卡器后,某些操作系统锁定文件的可能性很小,因此甚至不允许文件对象读取长度属性。然而,我在任何地方都找不到记录或报告,所以我非常怀疑

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

结果:

因此,我怀疑问题在别处

编辑:

既然OP更新了问题,我们终于有了相关的线索:

BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
这就是文件为空且长度为0的原因。FileWriter将打开文件进行写入,并覆盖现有内容(如果有)。您可以通过使用接受append标志的第二个参数传递第二个参数来防止这种情况:

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

换句话说,如果不希望覆盖内容,请将上面的行更改为:

BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath(), true);
1是aFile的副本,因为我见过其他复制文件的巨大方法,比如这里和这里

它是从文件构造的文件对象,不管是什么。这个过程与复制文件无关,不管是大文件、大文件还是其他文件。文件只包装一个文件名。不是它的内容。您的第一个链接也与复制文件无关

2第一个结果打印32,创建文件读取器后的第二个结果打印0。那么,为什么要删除这些内容呢


显然这不是真正的代码。真正的测试是fileReader.read是否立即返回-1。

那么,为了确保j仅仅是实际文件路径名的表示,您想要实现什么:什么是文件?没有将文件作为参数的文件构造函数。运行显示的代码后,是否检查了文件是否为空?如果在关闭BufferedReader和FileReader后打印j.length,会发生什么情况?我的假设是,要么你没有向我们显示所有的代码,要么这可能是预期的行为——也许j在文件打开阅读后无法再读取长度,但在文档中找不到任何内容。我实际上运行了这段代码,我很确定你没有向我们显示所有内容。首先,我必须添加一个try{}catch{}块。第二,j.length两次都给了我相同的输出。谢谢你的回复。我现在编辑了这个问题。这是你没有给我们看的相关行。我相应地更新了答案。
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath());
public FileWriter(String fileName, boolean append) throws IOException 
public FileWriter(File file, boolean append) throws IOException
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(aFile.getPath(), true);