Java中创建文件并在需要时创建目录的方法?

7
我正试图使用java.io写入文件,我想在路径"some/path/to/somewhere/then-my-file"创建它。创建文件时,路径上的任何目录都可能存在或不存在。我不想因为这些目录不存在而抛出IOException异常,而是希望需要时,透明地创建目录。
是否有一种方法可以在写文件的过程中创建所需的任何目录?我正在寻找Java SDK中的一些方法,或者可以添加到类路径中的轻量级库,例如Apache Commons IO。
P.S. 为了清楚起见,我已经编写了一个解决方案,对于我正在测试的比较狭窄的方式有效,因此我不需要关于如何编写我正在寻找的方法的建议。我正在寻找一个方法,它将被相当好地测试,并且跨平台兼容。
3个回答

25
今日免费次数已满, 请开通会员/明日再来

8
请注意,如果mkdirs()无法创建目录,它不会抛出IOException,而只是返回false。最好检查目录是否已经存在或者被成功创建。如果(!directory.exists()&&!directory.mkdirs())则抛出IOException(“无法创建目录”+ dir)是个好主意。 - Sam Barnum
是的,说得对。你可能会遇到一些相当不愉快的逻辑,比如父目录存在但不是目录,或者存在但不可写等等。 - skaffman
哇,我写了大约10行代码来尝试获取父目录,独立于系统,但是System.lineSeparator给出的结果显然与replaceAll不兼容,因为涉及到字符串和正则表达式等问题。我甚至使用了像这样可怕的正则表达式:separator=File.separator.replaceAll("'","\\\\'").replaceAll("\\\\","\\\\\\\\").replaceAll("\\\"","\\\\\""); 但它仍然不能正常工作。但显然有一个内置函数,我应该早点看到这一点。 - Fabian Röling

3

由于问题中提到了Apache Common IO库,因此我在下面介绍一个使用这个不错的库的解决方案:

File file = new File("...  the directory path ..."); 
FileUtils.forceMkdir(file);

这个解决方案使用了类FileUtils,它来自于包org.apache.commons.io和方法forceMkdir,该方法“创建目录,包括必要但不存在的父目录”。


2
TS想要创建一个“常规”文件。那么可以使用FileUtils.forceMkdir(regularFile.getParentFile())或者FileUtils.forceMkdirParent(regularFile)自2.5版本以来。 - Pavel Vlasov
好发现!随时可以编辑答案以改善它。评论通常是不必要的。 - JeanValjean

2

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