【发布时间】: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);
我知道这有点不清楚,但它的一般要点是它创建了 Clob 的 AsciiOutputStream(是的,它应该是 Clob)并将其写入 inStream 对象是从前一个方法传递过来的。
他们确信这不会写入文件目录,因为 File.delete(); 方法,但我知道昨天那个位置有一个文件,今天运行这段代码并写了一个文件在那个确切的位置。因为,虽然实际的 file 被删除了,但该文件所在位置的 pointer 仍然在 outFile 中,而 inStream 与 outFile 的创建使得inStream 指向该位置。
有什么理由相信这个文件不会在这种情况下写入?理想情况下,我想要一些证据证明delete() 方法删除了File 对象指向 的文件,而不是指针本身。
【问题讨论】:
-
你不能试试吗?
-
奇怪 - 写入文件输入流?
-
一个
File只包含一个文件位置;它不维护与文件的任何类型的连接,也不会使文件保持活动状态。 -
如果他们不能自己阅读 File.delete() 的 Javadoc 怎么办?我认为误解那里写的内容没有太多余地。
-
同上@AasmundEldhuset 所说的。
File是一个名称不佳的类,因为File实例不 代表(或以任何方式代表)文件。一个File实例代表一个路径名。很明显,删除具有给定路径名的文件不会阻止您随后创建具有相同路径名的新文件。