4

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

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

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

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

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

4

8 回答 8

8

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

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

FileUtils.forceMkDir(new File("/some/missing/parent/directory/foo"));
于 2012-08-06T07:26:19.007 回答
6

总有

if(!file.exists() && !file.mkDirs()) { // handle the failed to create situation... }
于 2013-04-04T19:25:19.823 回答
3

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

于 2012-08-06T07:01:54.633 回答
3

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

于 2012-08-06T09:16:24.267 回答
2

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

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

于 2012-08-06T07:17:19.717 回答
1

正如@stephan 在他的回答中提到的

优雅更多是主观的东西

但既然你要求

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();
    }
}
于 2012-08-06T07:08:08.927 回答
0
 File dir = new File(dirPath);
 if(!dir.exists())
     if(!dir.mkdirs()) {//throw or handle exception here.}

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

于 2013-01-09T06:39:26.853 回答
-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 让你写的东西

于 2013-04-04T19:34:03.357 回答