如何以编程方式在Java中使用unix命令来删除生成的目录

时间:2016-02-12 08:01:06

标签: java unix junit

我有一个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来实现我的目标

1 个答案:

答案 0 :(得分:3)

使用JUNit TemporaryFolder

您应该使用旨在清理文件的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
    }
}

使用shell代码

你的代码不起作用的原因是因为java没有像shell那样进行模式扩展,你可以通过启动执行删除的shell来模拟它:

new ProcessBuilder("sh", "-c", "rm -r *-*").inheritIO().start().waitFor();

使用纯Java代码删除目录

您还可以使用纯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。