【问题标题】:How to write elegant code using File.mkdirs() in java?如何在 java 中使用 File.mkdirs() 编写优雅的代码?
【发布时间】:2012-08-06 06:57:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java file io mkdirs


    【解决方案1】:

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

    我相信两者都可以通过在 Apache Commons IO 中使用 FileUtils 轻松完成:

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

    【讨论】:

      【解决方案2】:

      总会有

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

      【讨论】:

      • 或:if(!(file.exists() || file.mkDirs()))
      • if (!file.mkdirs())@WBT。
      • @EJP OP 不想在 if 的主体中执行代码,如果该目录已经存在。
      【解决方案3】:

      优雅是比较主观的东西,但是如果要检查目录是否真的创建,还要检查File.mkdirs()的返回值。如果它返回 false 它取决于您的应用程序如何处理它(例如抛出异常)。

      【讨论】:

        【解决方案4】:

        预测试没有意义。它只是引入了一个时间窗口,在此期间实际状态仍然可以改变,所以你仍然可能是错误的。只需调用mkdirs() 并测试它返回的结果。如果为假,则什么也不做;如果是真的,它做了一些事情。 它到底做了什么并没有实际意义。

        【讨论】:

        • 如果在路径已经存在时调用 mkdirs,它会返回 false 而不是 true。 File#mkdirs 的行为与 unix mkdir -p 不同。所以你关于它已经做了某事的陈述是准确的,但没有解决 OP 在使用它之前试图确保路径存在的问题。
        • @ChrisBetti 我就是这么说的。如果你调用它,你已经确保路径存在。
        • 在您声明“只需调用 mkdirs() 并测试它返回的结果”的地方,该部分是不正确的。 mkdirs() 在以下情况下返回 false: 1) 如果它无法创建目录。 2) 如果目录在调用之前就存在。
        【解决方案5】:

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

        我建议您尝试从构建实用程序的角度进行思考,然后使用实用程序构建实际的应用程序,而不是在任何地方混合详细的低级代码。您编写的实用程序可能对以后的项目有用,但这不是主要目标:即使您只在一个项目上使用实用程序方法,并且即使它只是从 one 放在高级代码中,如果它有助于使高级代码更清晰,仍然值得。我不记得是哪本书帮助我了解了这个概念。它可能是 Kernighan 和 Pike 的 The Practice of Programming,或 Raymond 的 The Art of UNIX Programming,或 Graham 的 On Lisp——或者可能所有三个。 (当然,了解您的语言的标准库也很重要,因此您不要开始编写已经为您编写的实用程序。)

        【讨论】:

        • 我非常同意你对代码设计的看法,谢谢你的建议。
        • 实用方法已经存在。它被称为File.mkdirs()。无需其他代码。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:
           File dir = new File(dirPath);
           if(!dir.exists())
               if(!dir.mkdirs()) {//throw or handle exception here.}
          

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

          【讨论】:

            【解决方案8】:

            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 让你编写的东西

            【讨论】:

            • 这里除了mkdirs() 之外的所有内容都是浪费时间。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            • 2015-03-03
            • 1970-01-01
            相关资源
            最近更新 更多