我写了一个JUnit 5测试,我需要创建一个zip文件,在上面放一些文本文件,然后删除该zip文件。
创建zip文件和其中的文本文件没有任何问题,但是每当我调用file.delete()
时,它都会返回false
。
我什至试图创建一个空的zip文件,但它也无法删除。有办法解决吗?
static File file;
@BeforeAll
static void setUp() throws IOException {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file=File.createTempFile("tempDir",".zip")));
ZipEntry e = new ZipEntry("emptyFile.txt");
out.putNextEntry(e);
out.closeEntry();
e = new ZipEntry("oneLineFile.txt");
out.putNextEntry(e);
StringBuilder sb;
byte[] data;
sb = new StringBuilder();
sb.append("route_id,agency_id,route_short_name,route_long_name,route_type");
data = sb.toString().getBytes();
out.write(data, 0, data.length);
out.closeEntry();
out.close();
}
@AfterAll
static void set(){
file.delete(); // return false
}
答案 0 :(得分:3)
如果您创建的临时文件不太多,请使用File.deleteOnExit()
:
请求在虚拟机终止时删除此抽象路径名表示的文件或目录。文件(或目录)按照注册时的相反顺序删除。调用此方法删除已注册删除的文件或目录无效。按照Java语言规范的规定,仅在正常终止虚拟机时才尝试删除。
文件系统操作可能不安全,例如Windows喜欢锁定JVM进程使用的文件。
此外,您的测试代码可能会异常终止,而没有正确关闭ZipOutputStream
可能会锁定文件并防止删除的情况。您应该使用finally
:
ZipOutputStream out = null;
try {
out = ...
} finally {
if (out != null)
out.close();
}