7

我对以下代码有点怀疑:

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”,并且它也被file.exists()返回“false”的方法确认。但是在运行时我没有得到任何异常,例如“IOException,文件“正在写入”不存在”或类似的东西。

为什么即使物理删除文件仍保留在堆中?不应该在调用 delete 方法后立即自动收集垃圾吗?我知道不是因为我看到了输出。

4

4 回答 4

4

这是因为File代表抽象路径,请参阅 JavaDoc http://docs.oracle.com/javase/6/docs/api/java/io/File.html。它不代表操作系统中的文件句柄。
您的代码中的行:

PrintWriter pw = new PrintWriter(file);

只需创建一个新文件。调用此函数后尝试删除文件...

于 2013-02-15T16:55:55.717 回答
2

Fileobject 表示文件系统上物理文件的路径存在或不存在。这就是为什么你必须exists()(检查它是否存在)和createNewFile()(如果找不到则创建文件)。


另请注意,PrintWriter(File file)如果新文件不存在,则会创建一个新文件。

参数:

file - 用作此 writer 目标的文件。如果文件存在,那么它将被截断为零大小;否则,将创建一个新文件。输出将被写入文件并被缓冲。

于 2013-02-15T16:54:57.870 回答
1

File 是真实文件的句柄(存在与否)。正如您所说,您创建然后删除上面的文件 - 到目前为止一切都很好。

当您稍后使用 PrintWriter 时,它会在您使用它时再次创建文件 - 您之前删除它并不重要。

实际上,根据您的用例,这可能正是您想要的 - 例如,您可能想要删除旧的日志文件,然后再重新创建和写入它。

最后,在您的方法存在之前,您的代码中的任何内容都没有资格进行垃圾收集,即使这样,底层文件也将继续存在(如果您不再次删除它) - 在这种情况下,任何垃圾收集都不会影响底层文件。它会在删除调用后被删除,一旦你的 PrintWriter 完成它就会再次存在。

希望这可以帮助!

于 2013-02-15T17:01:17.070 回答
0

该文件没有指向特定文件的链接,而是指向文件路径的任何文件指针。使用这一行,您将创建一个新文件:

PrintWriter pw = new PrintWriter(file);
于 2013-02-15T16:56:54.973 回答