如何为给定路径创建文件(包括文件夹)?

57

我正在从网络下载一个zip文件,其中包含文件夹和文件。使用 ZipInputstreamZipEntry 对它们进行解压缩。 Zipentry.getName 会将文件名显示为 htm/css/aaa.htm

所以我创建了一个新的 File(zipentry.getName);

但问题是它抛出了一个异常:文件未找到。我知道这是因为它正在创建子文件夹htmcss

我的问题是:如何通过传递上述路径来创建其子目录中的文件?

6个回答

123
请使用以下内容:
File targetFile = new File("foo/bar/phleem.css");
File parent = targetFile.getParentFile();
if (parent != null && !parent.exists() && !parent.mkdirs()) {
    throw new IllegalStateException("Couldn't create dir: " + parent);
}

虽然您可以只执行file.getParentFile().mkdirs()而不检查结果,但最佳做法是检查操作的返回值。因此,首先检查现有目录,然后检查成功创建(如果尚不存在)。
另外,如果路径不包括任何父目录,则parent将为null。请进行健壮性检查。 参考资料:

如果我有路径 a/b/c/d/e.txt。要创建 e.txt,我必须创建 a、b、c、d 文件夹。我该如何做到这一点? - Srinivas
1
mkDir() 只创建一个层级的父目录,而 mkDirs() 则会创建所有的父目录、祖父目录等。 - Sean Patrick Floyd
正如我所写的那样:new File("a/b/c/d/e.txt").getParentFile().mkDirs() 会创建所有需要的文件夹,而不仅仅是父文件夹。 - Sean Patrick Floyd
1
应该是 mkdirs 而不是 mkDirs。小写的 'd'。 - dogbane
1
改了一下,之前太习惯自动补全了。 - Sean Patrick Floyd
顺便说一下,这是一个很好的降低投票的理由。谁知道呢,也许我在某个地方也忘了加分号。 - Sean Patrick Floyd

14

4

Java NIO API Files.createDirectories

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Path path = Paths.get("/folder1/folder2/folder3");
Files.createDirectories(path);


2

在遍历Zip文件中的条目时,如果有必要,您需要创建子目录。

ZipFile zipFile = new ZipFile(myZipFile);
Enumeration e = zipFile.entries();
while(e.hasMoreElements()){
    ZipEntry entry = (ZipEntry)e.nextElement();
    File destinationFilePath = new File(entry.getName());
    destinationFilePath.getParentFile().mkdirs();
    if(!entry.isDirectory()){
        //code to uncompress the file 
    }
}

1
看起来不错,但我会在 if(!entry.isDirectory()) 块内创建文件夹,因为你已经创建了所有必需的父文件夹,所以当 entry 是一个目录时就没有必要创建。 - Sean Patrick Floyd

1

1

这就是我做的方式

static void ensureFoldersExist(File folder) {
    if (!folder.exists()) {
        if (!folder.mkdirs()) {
            ensureFoldersExist(folder.getParentFile());
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接