我对以下代码有点怀疑:
try {
File file = new File("writing");
file.createNewFile();
System.out.println(file.delete());
System.out.println(file.exists());
PrintWriter pw = new PrintWriter(file);
pw.print(324.2342);
pw.flush();
pw.close();
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
System.out.println(br.readLine());
br.close();
} catch(IOException ioE) {
System.out.println("Indeed");
}
为什么在这种情况下,方法file.delete()显然表示它在执行时返回"true",并且它也得到了返回"false"的file.exists()
方法的确认。然而,在运行时,我没有得到任何异常,如"IOException文件"写入"不存在"或类似的情况。
为什么文件在物理删除的情况下仍保留在堆中?难道不应该在调用delete方法后立即自动进行垃圾收集吗?我知道没有,因为我看到了输出。
这是因为File
表示一个抽象路径,请参阅JavaDochttp://docs.oracle.com/javase/6/docs/api/java/io/File.html.它不代表操作系统中的文件句柄
代码中的行:
PrintWriter pw = new PrintWriter(file);
只需创建一个新文件。调用后尝试删除文件。。。
File
对象表示文件系统上物理文件的路径,无论是否存在。这就是为什么您有exists()
(用于检查它是否存在)和createNewFile()
(用于在找不到文件的情况下创建文件)。
还要注意,如果PrintWriter(File file)
不存在,它将创建一个新文件。
参数:
file—要用作此编写器目标的文件。如果文件存在,则它将被截断为零大小;否则,一个新文件将被创建。输出将写入文件缓冲。
文件是真实文件(存在与否)的句柄。正如你所说,你创建然后删除上面的文件——到目前为止一切都很好。
当你稍后使用PrintWriter时,它会在你使用它时再次创建文件——不管你以前删除过它。
事实上,根据您的用例,这可能是您想要的确切原因——例如,在重新创建并再次写入之前,您可能想要删除一个旧的日志文件。
最后,在你的方法存在之前,你的代码中没有任何东西可以进行垃圾收集,即使这样,底层文件也会继续存在(如果你不删除它的话)——在这种情况下,任何垃圾收集都不会影响底层文件。它将在删除调用后被删除,并在PrintWriter完成后再次存在。
希望这能有所帮助!
文件没有指向特定文件的链接,而是指向文件路径下的任何文件指针。使用这一行,您将创建一个新文件:
PrintWriter pw = new PrintWriter(file);