我需要一个目录来保存文件,但我不确定它是否存在 所以我需要先检查它是否存在,并在必要时创建它。
File saveDir = new File("/tmp/appname/savedir/");
if(!saveDir.exists()){
saveDir.mkdirs();
}
如上所述,有一个问题 方法“saveDir.exists()”返回一个布尔值,指示文件路径是否存在。
当然,我可以编写一些冗余和丑陋的代码来工作。
有没有办法编写一些优雅的代码来实现这个目标?
答案 0 :(得分:8)
是关于“冗余”检查目录存在代码的问题,还是需要创建目录和所有缺少的父目录?
我相信在Apache Commons IO中使用FileUtils可以轻松完成这两项工作:
FileUtils.forceMkDir(new File("/some/missing/parent/directory/foo"));
答案 1 :(得分:5)
总有
if(!file.exists() && !file.mkDirs()) { // handle the failed to create situation... }
答案 2 :(得分:3)
优雅更具主观性,但如果要检查目录是否实际创建,请同时检查File.mkdirs()
的返回值。如果它返回false
,则取决于您的应用程序如何处理它(例如抛出异常)。
答案 3 :(得分:3)
预测试没有意义。它只是引入了一个时间窗口,在此期间实际状态仍然可以改变,所以你仍然可能出错。只需调用mkdirs()
并测试它返回的结果。如果不对,它什么也没做;如果是真的,那就做了些什么。 究竟是什么确实没有实际意义。
答案 4 :(得分:2)
我会在实用程序类中创建一个静态方法,它保存文件并且会自动同时创建所有必需的目录。实用程序方法中的代码 可能有点冗长,但是这样,您可以保留高级应用程序逻辑的丑陋,冗长的代码 out 。在未来的项目中,您始终可以重用该实用程序。将此代码拆分为实用程序方法后,也可以轻松地单独进行测试。
我建议您尝试考虑构建实用程序,然后使用实用程序构建实际应用程序,而不是在任何地方混合详细的低级代码。您编写的实用程序在以后的项目中可能很有用,但这不是主要目标:即使您只在一个项目上使用实用程序方法,而即使仅从一个< / em>放置在更高级别的代码中,如果它有助于使更高级别的代码更清晰,那么仍然值得。我不记得哪本书帮助我得到了这个概念;可能是Kernighan和Pike的编程实践,或Raymond的 UNIX编程艺术,或Graham的 On Lisp - 或者可能全部三个。 (当然,了解您的语言标准库也很重要,因此您不必开始编写已经为您编写的实用程序。)
答案 5 :(得分:1)
正如@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();
}
}
答案 6 :(得分:0)
File dir = new File(dirPath);
if(!dir.exists())
if(!dir.mkdirs()) {//throw or handle exception here.}
你仍然需要抛出或处理在File.mkdirs()期间可能抛出的SecurityException
答案 7 :(得分:-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,让你写出来