-2

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

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

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

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

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

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

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

4

1 回答 1

1

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

File.mkdirs()可能由于任何失败的原因而File.mkdir()失败(由于父目录不存在而失败(出于明显的原因)除外)。

Javadoc

public boolean mkdirs()

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

粗体位是一条线索,mkdirs()它只是多次调用mkdir().

这是什么-mkdirs()有效地调用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());
}
于 2012-06-14T02:47:44.670 回答