我的同事和我正在讨论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()
对象指向的文件,而不是指针本身。
答案 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
不适合我们关于文件指针应该是什么的概念。