File.delete()是否删除File对象的指针?

时间:2015-04-03 17:40:21

标签: java file java-io

我的同事和我正在讨论File.delete()方法如何在Java中工作。

在我们的代码中:

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);

我知道它有点不清楚,但它的一般要点是它创建AsciiOutputStream的{​​{1}}(是的它应该是Clob)并将其写入从前一个方法传递的Clob对象。

他们确信这不会因为inStream方法而写入文件目录,但我知道昨天在该位置有一个文件,这个代码今天运行并写了在该确切位置的文件。因为,虽然删除了实际的文件,但该文件所在位置的指针仍在File.delete();中,并且创建了outFile inStream使outFile指向该位置。

有没有理由相信在这种情况下不会写这个文件?理想情况下,我想要一些证明inStream方法删除delete()对象指向的文件,而不是指针本身。

1 个答案:

答案 0 :(得分:5)

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

  

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

     

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

     

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

使用the source code for File,我们可以看到它是String的包装。

delete无法删除文件指针,因为没有文件指针。

  

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

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

  

文件描述符类的实例充当表示打开文件的底层机器特定结构的不透明句柄。

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

  

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

     

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

我们可以观察到,例如,委派给the constructor for FileOutputStream的{{3}}仅从String获取路径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没有提供这样做的方法; ergo,File不适合我们关于文件指针应该是什么的概念。