File.delete()方法会删除文件本身,但不会删除File对象的指针。

6
我的同事和我在就Java中的File.delete()方法如何工作进行争论。
在我们的代码中:
File outFile = new File("/dir/name.ext");
if(outFile.exists())
    outFile.delete();

FileInputStream inStream = new FileInputStream(outFile);

WriteFile.writeFile(inStream); // Writes the actual file

由于安全原因,我无法在此处包含writeFile的整个方法体,但它创建所需的数据库对象后执行以下操作:

BufferedOutputStream out = null;

Object[] args = {"an_encrypted_data_clob_name_in_the_database"};
Class[] argTypes = {Class.forName("java.lang.String")};
Object result = WSCallHelper.jdbcCall(null, rs, "getCLOB", args, argTypes);
CLOB clob = (CLOB)result;
out = new BufferedOutputStream(clob.getAsciiOutputStream());

byte[] buffer = new byte[512];
int bytesRead = -1;

while((bytesRead = inStream.read(buffer)) > -1)
    out.write(buffer, 0, bytesRead);

我知道这有点不清楚,但总的意思是它创建了一个的并将其写入从先前方法传递的对象中。他们认为这不会写入文件目录,因为有方法,但我确切地知道昨天在那个位置上有一个文件,并且今天这段代码运行并在那个确切的位置上写了一个文件。因为,尽管实际的文件被删除了,但指向该文件位置的指针仍然在中,并且使用创建使得指向该位置。
在这种情况下,有理由相信这个文件不会被写入吗?理想情况下,我想要一些证据证明方法删除的是对象所指向的文件,而不是指针本身。

2
你就不能试一下吗? - forgivenson
2
奇怪 - 向一个FileInputStream写入? - laune
5
一个文件(File)仅包含文件位置信息,它不会维护与文件的任何连接,也不会保持文件处于打开状态。 - Aasmund Eldhuset
5
如果他们自己无法阅读,那么向他们阅读File.delete()的Javadoc怎么样?我认为那里写得很清楚,不太可能会有什么误解。 - laune
3
同意 @AasmundEldhuset 的说法。File 这个类名取得不好,因为 File 实例并 _不代表_(或以任何方式代表)一个文件。File 实例代表了一个 _路径名_。显然,删除具有特定路径名的文件并不会防止您随后创建具有相同路径名的新文件。 - Solomon Slow
显示剩余6条评论
1个回答

6

java.io.File 不是文件指针,也不持有文件指针。它是一个不可变的路径名。

文件和目录路径名的抽象表示。

该类的实例可能表示实际的文件系统对象,如文件或目录,也可能不表示。

File 类的实例是不可变的;即,一旦创建,由 File 对象表示的抽象路径名将永远不会改变。

通过 File 的源代码,我们可以看到它是一个围绕 String 的包装器。

delete 无法删除文件指针,因为不存在文件指针。

删除此抽象路径名所表示的文件或目录。

打开文件的连接由java.io.FileDescriptor表示:

文件描述符类的实例用作底层机器特定结构的不透明句柄,表示打开的文件[...]。

这就是输入/输出流与文件系统交互的方式,例如FileOutputStream(File)解释如下:

创建一个文件输出流以写入由指定的 File 对象表示的文件。 创建一个新的 FileDescriptor 对象来表示此文件连接。

如果文件[...]不存在但无法创建,或者由于任何其他原因无法打开,则会抛出 FileNotFoundException

我们可以观察到,例如, FileOutputStream 构造函数 被委托仅获取来自 File 的路径字符串,检查其是否有效,然后丢弃 File

public FileOutputStream(File file, boolean append)
    throws FileNotFoundException
{
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    if (file.isInvalid()) {
        throw new FileNotFoundException("Invalid file path");
    }
    this.fd = new FileDescriptor();
    fd.attach(this);
    this.append = append;
    open(name, append);
}

没有文档支持java.io.File表示文件指针的想法。;)

我们还知道,对文件的打开句柄是必须在某个时刻释放的资源,但是File没有提供这样做的方法;因此,File不符合我们对文件指针的概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接