【问题标题】:Does File.delete() delete the pointer of the File object?File.delete() 是否删除 File 对象的指针?
【发布时间】:2015-06-08 19:58:26
【问题描述】:

我和我的同事正在争论 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);

我知道这有点不清楚,但它的一般要点是它创建了 ClobAsciiOutputStream(是的,它应该是 Clob)并将其写入 inStream 对象是从前一个方法传递过来的。

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

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

【问题讨论】:

  • 你不能试试吗?
  • 奇怪 - 写入文件输入流?
  • 一个File只包含一个文件位置;它不维护与文件的任何类型的连接,也不会使文件保持活动状态。
  • 如果他们不能自己阅读 File.delete() 的 Javadoc 怎么办?我认为误解那里写的内容没有太多余地。
  • 同上@AasmundEldhuset 所说的。 File 是一个名称不佳的类,因为File 实例 代表(或以任何方式代表)文件。一个File 实例代表一个路径名。很明显,删除具有给定路径名的文件不会阻止您随后创建具有相同路径名的新文件。

标签: java file java-io


【解决方案1】:

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 仅从File 获取路径String,检查它是否有效,然后丢弃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 不符合我们对文件指针应该是什么的概念。

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 2011-05-02
    • 2015-07-02
    • 2021-10-16
    • 2012-09-10
    • 2018-05-02
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多