最近我正在进行代码审查,代码是这样的:
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
的副本,因为我看过其他复制文件的大方法,例如here。
第一个System.out.println()
打印32
,第二个,在创建文件阅读器后,打印0
。那么,为什么内容会被删除?有人能解释一下这里发生了什么吗?
我把那些System.out.println()
语句检查文件是否为空。
解决方案:
阅读完答案后,我想我发现代码有什么问题。如果j
只是一个引用,那么fileWriter
正在尝试写入同一个文件并且它是循环的。我在这儿吗?
编辑:这不是建议问题的重复,因为整个混淆是认为j
是aFile
的克隆或重复。
答案 0 :(得分:0)
1)j
不是重复的,它是对包装实际文件的新文件对象的引用。
2)此代码无法删除(甚至更改)文件。还有更多的代码吗?
答案 1 :(得分:0)
你没有向我们展示一切,是吗?
显示的代码肯定不会更改或删除文件,正如您所使用的类的名称所示:BufferedReader
,FileReader
(注意 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());
这就是文件为空的原因及其长度0
。 FileWriter
将打开文件进行写入并覆盖现有内容(如果有)。你可以通过传入第二个参数来防止这种情况,使用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的副本,因为我已经看到了其他复制文件的巨大方法,比如这里和这里。
它是File
从aFile
构造的对象,无论可能是什么。这个过程与复制文件没有任何关系,无论是巨大的还是巨大的。 File
只包装文件名称。不是它的内容。您的第一个链接与复制文件无关。
2)第一个结果打印32,第二个结果在创建文件读取器后打印0.因此,为什么内容会被删除?
显然这不是真正的代码。真正的考验是fileReader.read()
是否立即返回-1。