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

Zib*_*obz 6 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
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rad*_*def 5

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

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

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

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

有了源代码File,我们可以看到它是一个包装器String.

delete 因为没有文件指针,所以无法删除文件指针.

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

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

文件描述符类的实例充当表示打开文件的基础机器特定结构的不透明句柄[...].

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

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

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

我们可以观察到,例如,用于构造FileOutputStream被委托给仅仅获取路径StringFile,检查它是否有效,然后丢弃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);
}
Run Code Online (Sandbox Code Playgroud)

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

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