我对以下代码有点怀疑:
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方法,它不应该自动被垃圾收集吗?我知道它不是因为我看到了输出。
答案 0 :(得分:4)
这是因为File
表示一个抽象路径,请参阅JavaDoc http://docs.oracle.com/javase/6/docs/api/java/io/File.html。它不代表操作系统中的文件句柄
代码中的一行:
PrintWriter pw = new PrintWriter(file);
只需创建一个新文件即可。尝试在调用此文件后删除该文件...
答案 1 :(得分:2)
File
object表示文件系统上物理文件的路径是否存在。这就是为什么你有exists()
(检查它是否存在)和createNewFile()
(如果找不到则创建文件)的原因。
另请注意,PrintWriter(File file)
会创建一个新文件,如果它不存在。
<强>参数:强>
file - 要用作此writer的目标的文件。如果是文件 然后它将被截断为零大小;否则,一个新文件 将被创建。输出将被写入文件并且是 缓冲。
答案 2 :(得分:1)
文件是真实文件的句柄(是否存在)。你正在创建并删除上面的文件 - 到目前为止一切都很好。
当你稍后来到PrintWriter时,它会在你使用它时再次创建文件 - 你之前删除它并不重要。
事实上,根据您的使用情况,这可能是您想要的 - 例如,您可能希望删除旧的日志文件,例如在重新创建并再次写入之前。
最后,在您的方法存在之前,您的代码中没有任何内容符合垃圾收集的条件,即使这样,底层文件也将继续存在(如果您不删除它) - 并且在这种情况下任何垃圾收集都不会影响底层文件。删除调用后它将被删除,并在PrintWriter完成后再次存在。
希望这有帮助!
答案 3 :(得分:0)
该文件没有指向特定文件的链接,而是文件路径中的任何文件指针。使用此行,您将创建一个新文件:
PrintWriter pw = new PrintWriter(file);