如何在java中使用File.mkdirs()编写优雅的代码?

时间:2012-08-06 06:57:34

标签: java file io mkdirs

我需要一个目录来保存文件,但我不确定它是否存在 所以我需要先检查它是否存在,并在必要时创建它。

File saveDir = new File("/tmp/appname/savedir/");
if(!saveDir.exists()){
    saveDir.mkdirs(); 
}

如上所述,有一个问题 方法“saveDir.exists()”返回一个布尔值,指示文件路径是否存在。

当然,我可以编写一些冗余和丑陋的代码来工作。

有没有办法编写一些优雅的代码来实现这个目标?

8 个答案:

答案 0 :(得分:8)

是关于“冗余”检查目录存在代码的问题,还是需要创建目录和所有缺少的父目录?

我相信在Apache Commons IO中使用FileUtils可以轻松完成这两项工作:

FileUtils.forceMkDir(new File("/some/missing/parent/directory/foo"));

答案 1 :(得分:5)

总有

if(!file.exists() && !file.mkDirs()) { // handle the failed to create situation... }

答案 2 :(得分:3)

优雅更具主观性,但如果要检查目录是否实际创建,请同时检查File.mkdirs()的返回值。如果它返回false,则取决于您的应用程序如何处理它(例如抛出异常)。

答案 3 :(得分:3)

预测试没有意义。它只是引入了一个时间窗口,在此期间实际状态仍然可以改变,所以你仍然可能出错。只需调用mkdirs()并测试它返回的结果。如果不对,它什么也没做;如果是真的,那就做了些什么。 究竟是什么确实没有实际意义。

答案 4 :(得分:2)

我会在实用程序类中创建一个静态方法,它保存文件并且会自动同时创建所有必需的目录。实用程序方法中的代码 可能有点冗长,但是这样,您可以保留高级应用程序逻辑的丑陋,冗长的代码 out 。在未来的项目中,您始终可以重用该实用程序。将此代码拆分为实用程序方法后,也可以轻松地单独进行测试。

我建议您尝试考虑构建实用程序,然后使用实用程序构建实际应用程序,而不是在任何地方混合详细的低级代码。您编写的实用程序在以后的项目中可能很有用,但这不是主要目标:即使您只在一个项目上使用实用程序方法,而即使仅从一个< / em>放置在更高级别的代码中,如果它有助于使更高级别的代码更清晰,那么仍然值得。我不记得哪本书帮助我得到了这个概念;可能是Kernighan和Pike的编程实践,或Raymond的 UNIX编程艺术,或Graham的 On Lisp - 或者可能全部三个。 (当然,了解您的语言标准库也很重要,因此您不必开始编写已经为您编写的实用程序。)

答案 5 :(得分:1)

正如@stephan在answer

中提到的那样
  

优雅更像是一种主观的东西

但是既然你要求它

import java.io.File;

public class FileBuilder {
    File file;

    public FileBuilder(String path) {
        file = new File(path);
    }

    public FileBuilder createIfDirDoesNotExists() {
        if (!file.exists()) {
            file.mkdirs();
        }
        return this;
    }

    public File getFile() {
        return file;
    }
}

然后你可以做

class test {
    public test() {
        File file = new FileBuilder("/tmp/appname/savedir/").createIfDirDoesNotExists().getFile();
    }
}

答案 6 :(得分:0)

 File dir = new File(dirPath);
 if(!dir.exists())
     if(!dir.mkdirs()) {//throw or handle exception here.}

你仍然需要抛出或处理在File.mkdirs()期间可能抛出的SecurityException

答案 7 :(得分:-1)

file.exists()将返回目录或文件是否存在。您还可以使用isDirectory()来检查文件路径是否是目录

if (file.isDirectory()){
      //do somethign because this directory already exists
}
else if (file.isFile()){
      //do somethign because this file already exists
}
else {
     boolean created = file.mkdirs();
     if (!created) {
        throw new IOException("Cannot create directory " + file);
     }
}

至于这是多么优雅....我会亲自将它包装在一个util方法中,以隐藏一些额外的java,让你写出来