删除带有文件的文件的奇怪行为。delete()
请考虑以下示例 Java 类 (pom.xml如下所示):
package test.filedelete;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import org.apache.commons.io.IOUtils;
public class Main
{
public static void main(String[] args) throws IOException
{
byte[] bytes = "testtesttesttesttesttesttesttesttesttest".getBytes();
InputStream is = new ByteArrayInputStream(bytes);
Path tempFileToBeDeleted = Files.createTempFile("test", "");
OutputStream os = Files.newOutputStream(tempFileToBeDeleted);
IOUtils.copy(is, os);
deleteAndCheck(tempFileToBeDeleted);
// breakpoint 1
System.out.println("\nClosing stream\n");
os.close();
deleteAndCheck(tempFileToBeDeleted);
}
private static void deleteAndCheck(Path file) throws IOException
{
System.out.println("Deleting file: " + file);
try
{
Files.delete(file);
}
catch (NoSuchFileException e)
{
System.out.println("No such file");
}
System.out.println("File really deleted: " + !Files.exists(file));
System.out.println("Recreating deleted file ...");
try
{
Files.createFile(file);
System.out.println("Recreation successful");
}
catch (IOException e)
{
System.out.println("Recreation not possible, exception: " + e.getClass().getName());
}
}
}
我写入文件输出流,然后尝试删除该文件,而无需先关闭流。这是我最初的问题,当然是错误的,但它导致了一些奇怪的观察结果。
当您在 Windows 7 上运行主方法时,它将生成以下输出:
Deleting file: C:\Users\MSCHAE~1\AppData\Local\Temp\test6100073603559201768
File really deleted: true
Recreating deleted file ...
Recreation not possible, exception: java.nio.file.AccessDeniedException
Closing stream
Deleting file: C:\Users\MSCHAE~1\AppData\Local\Temp\test6100073603559201768
No such file
File really deleted: true
Recreating deleted file ...
Recreation successful
- 为什么第一次调用 Files.delete() 时不会引发异常?
- 为什么以下对 Files.exist() 的调用返回 false?
- 为什么无法重新创建文件?
关于最后一个问题,我注意到当您在断点1处停止时,该文件在资源管理器中仍然可见。当您终止JVM时,该文件仍将被删除。关闭流删除后,AndCheck() 按预期工作。
在我看来,在关闭流之前,删除操作不会传播到操作系统,并且文件 API 没有正确反映这一点。
有人能解释一下这里到底发生了什么吗?
啪.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>filedelete</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
澄清更新
如果关闭流并调用 Files.delete() - 触发最后一个操作 - 或者如果在未关闭流的情况下调用了 Files.delete() 并且终止了 JVM,则文件将在 Windows 资源管理器中消失。