问题:我需要确保文件系统中存在特定的目录层次结构,如果不存在则创建它。
我知道有方法File.mkdirs()
但是该方法的javadoc表明它可能无法创建完成给定路径所需的部分或全部目录。
为了解决这个问题,我创建了一个方法,该方法接受表示路径的String并将其解析为各个部分,并将它们存储到ArrayList<String>
中。然后第二种方法将完成并构建目录,确保每个目录和子目录都存在。
问题是,当尝试循环并将字符串分解为各个部分时,实际程序内存不足。我知道这不是功能;它在JUnit测试中完全可以自行运行,并且程序本身不是非常占用内存。此时,它只是设置目录并将它们存储到“DataBank”类中 - 没什么大的,只是一个存储一堆字符串的类。
我想知道是什么导致了这个问题;我可以在代码停止时回复有效的不同类。
但是,更简单的解决方案可能只是使用File.mkdirs()
。什么会导致File.mkdirs()
无法创建目录?它只是权限不足吗?
如果可以的话,我想简化这个过程,而不是试图重新发明轮子。但与此同时,我知道该程序不应该耗尽内存 - 我正在存储字符串并执行文件操作,没有超级密集。
答案 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());
}