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

标签 java unix junit

我有一个Java代码,执行后会在其中生成目录和文件。目录名称如下:

ef3487f7457-43gfggf545-tgrg4536363-53345

ef3487f7457-43gfggf545-tgrg4536363-53462

ef3487f7457-43gfggf545-tgrg4536363-45742

每个目录中都有文件。

如何在java代码中删除这些目录?我对它们没有用处,它们只是增加了我的磁盘空间使用量。这是我在 checkin 任何内容之前运行的一些单元测试。

类似这样的事情:

@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 来实现我的目标

最佳答案

使用 JUNit 临时文件夹

您应该使用旨在清理文件的 junit 规则。 JUnit 附带 TemporaryFolder这正是为此类单元测试而设计的。

The TemporaryFolder Rule allows creation of files and folders that should be deleted when the test method finishes (whether it passes or fails). Whether the deletion is successful or not is not checked by this rule. No exception will be thrown in case the deletion fails.

很容易将其集成到您的单元测试中:

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();
}

上面的代码使用正则表达式来查找文件,然后对它们调用删除。

关于java - 如何在 Java 中以编程方式使用 unix 命令来删除生成的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35357511/

相关文章:

java - 空回复正文发帖放心

java - Junit 测试预期结果的 Xml 字符串表示

java - 以id为主键同时创建实体和依赖实体

java - 找不到主类java错误

c - open() 的区别

java - 在 Spring 测试中请求范围内的bean

java - java中输入某些字符时显示错误

java - spring httpsession 和 tomcat session 的区别

java - 根据里面的JPanel调整JScrollPane

ubuntu - Docker 容器创建由 root 拥有的目录,我需要它们由 1000 :1000 拥有