确保文件系统中存在特定的目录层次结构(如果需要,可以创建)

时间:2012-06-14 02:03:57

标签: java string memory arraylist

问题:我需要确保文件系统中存在特定的目录层次结构,如果不存在则创建它。

我知道有方法File.mkdirs()但是该方法的javadoc表明它可能无法创建完成给定路径所需的部分或全部目录。

为了解决这个问题,我创建了一个方法,该方法接受表示路径的String并将其解析为各个部分,并将它们存储到ArrayList<String>中。然后第二种方法将完成并构建目录,确保每个目录和子目录都存在。

问题是,当尝试循环并将字符串分解为各个部分时,实际程序内存不足。我知道这不是功能;它在JUnit测试中完全可以自行运行,并且程序本身不是非常占用内存。此时,它只是设置目录并将它们存储到“DataBank”类中 - 没什么大的,只是一个存储一堆字符串的类。

我想知道是什么导致了这个问题;我可以在代码停止时回复有效的不同类。

但是,更简单的解决方案可能只是使用File.mkdirs()。什么会导致File.mkdirs()无法创建目录?它只是权限不足吗?

如果可以的话,我想简化这个过程,而不是试图重新发明轮子。但与此同时,我知道该程序不应该耗尽内存 - 我正在存储字符串并执行文件操作,没有超级密集。

1 个答案:

答案 0 :(得分:1)

  

但是,更简单的解决方案可能只是使用File.mkdirs()。什么会导致File.mkdirs()不创建目录?它只是权限不足吗?

File.mkdirs()可能由于File.mkdir()失败的任何原因而失败(除了由于父目录不存在而导致失败(由于显而易见的原因))。

来自Javadoc

  

public boolean mkdirs()

     

创建此抽象路径名所指定的目录,包括任何必要但不存在的父目录。 请注意,如果此操作失败,则可能已成功创建一些必要的父目录

粗体位是mkdirs()只是多次调用mkdir()的快捷方式的线索。

Here's what mkdirs() does - 它有效地调用mkdir()目录层次结构:

public boolean mkdirs() {
    if (exists()) {
        return false;
    }
    if (mkdir()) {
        return true;
    }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e) {
        return false;
    }

    File parent = canonFile.getParentFile();
    return (parent != null && (parent.mkdirs() || parent.exists()) &&
            canonFile.mkdir());
}