我有一个Java代码,在执行后会在其中生成目录和文件。目录名称如下:
ef3487f7457-43gfggf545-tgrg4536363-53345
ef3487f7457-43gfggf545-tgrg4536363-53462
ef3487f7457-43gfggf545-tgrg4536363-45742
每个目录中都有文件。
如何在java代码中删除这些目录?我没有用它们,它们只是增加了我的磁盘空间使用量。这是我在检查任何内容之前运行的一些单元测试。
这样的事情:
@After
public void afterUnitTestExecution() {
logger.info("Deleting bullshit files...");
try {
java.lang.Runtime.getRuntime().exec("rm -r *-*");
} catch (IOException e) {
e.printStackTrace();
}
}
这段代码看起来应该可行,但事实并非如此。手动执行rm -r *-*
它有效,但在Java中进行(如上所示)则不然。怎么了?任何帮助或帮助将不胜感激。感谢
编辑:
感谢你们的建议。但是我不想使用特定于JUnit的东西,我更喜欢使用标准的传统Java而不是Junit来实现我的目标
答案 0 :(得分:3)
您应该使用旨在清理文件的junit规则。 JUnit带有一个TemporaryFolder,它完全是为这种单元测试而设计的。
TemporaryFolder规则允许创建文件和文件夹 测试方法完成时应删除(无论是否通过或 失败)。删除是否成功不会被检查 这个规则。如果删除失败,则不会抛出任何异常。
将其集成到单元测试中很容易:
public static class HasTempFolder {
@Rule
public TemporaryFolder folder= new TemporaryFolder();
@Test
public void testUsingTempFolder() throws IOException {
File createdFolder= folder.newFolder("subfolder");
// Run your code here
}
}
你的代码不起作用的原因是因为java没有像shell那样进行模式扩展,你可以通过启动执行删除的shell来模拟它:
new ProcessBuilder("sh", "-c", "rm -r *-*").inheritIO().start().waitFor();
您还可以使用纯Java代码删除目录,使用File.listFiles()
将文件与模式匹配器一起列出,然后调用File.delete()
删除文件。
Java 1.8
File f = new File("."); // Cuncurrent directory
Arrays.stream(f.listFiles(fi->fi.getName().match("[0-9a-f-]{36}"))).forEach(File::delete);
Java 1.6及更高版本
File f = new File("."); // Cuncurrent directory
File[] files = f.listFiles(new FileFilter() {
public boolean accept(File fi) {
return fi.getName().match("[0-9a-f-]{36}");
}
});
for(File file : files) {
file.delete();
}
上面的代码使用正则表达式来查找文件,然后在它们上面调用delete。