如何在使用Files.createDirectories()时根据目录是否存在或创建结果记录指定日志
如何在使用Files.createDirectories()时根据目录是否存在或创建结果记录指定日志
我明白你现在的需求——想用Files.createDirectories()创建多级目录,同时要精准控制日志:目录本来就存在就啥也不输出,要是刚创建成功就打“Directory Created”对吧?这个需求挺常见的,我之前做文件管理模块的时候也遇到过,给你分享两个实用的实现方式,你可以根据场景选:
方法一:先检查再创建(单线程/低并发场景首选)
这种方式逻辑最直观,先判断目录是否存在,不存在再创建并打日志。代码简单易懂,适合单线程或者并发很低的场景:
import java.nio.file.Files; import java.nio.file.Paths; public class DirectoryLogger { public static void main(String[] args) { String path = "E:\\krishTest\\"; String filename = path + "firstsheet.xls"; try { var dirPath = Paths.get(path); // 先判断目录是否存在 if (!Files.exists(dirPath)) { Files.createDirectories(dirPath); System.out.println("Directory Created"); } // 如果目录已存在,这里可以选择打日志或者啥也不做 // 比如需要的话可以放开下面这行 // System.out.println("Directory already exists"); } catch (Exception ex) { System.out.println("创建目录时出错: " + ex.getMessage()); } } }
不过要提一句,这个方法有个小局限:存在竞态条件。比如在多线程或者多进程环境下,你刚检查完“目录不存在”,还没执行创建,另一个线程/进程已经把目录创建了,这时候Files.createDirectories()不会报错,但我们的代码还是会输出“Directory Created”,属于日志误报。如果你的场景是单线程,完全不用在意这个问题;要是高并发场景,就看下面的方法。
方法二:基于时间戳判断(高并发场景更严谨)
这种方法绕开了“检查-创建”的竞态问题,通过记录创建前的时间,再对比目录的修改/创建时间,判断是不是本次调用创建的目录。代码稍微复杂一点,但在多线程环境下更可靠:
import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.attribute.FileTime; import java.time.Instant; public class DirectoryLogger { public static void main(String[] args) { String path = "E:\\krishTest\\"; String filename = path + "firstsheet.xls"; try { var dirPath = Paths.get(path); // 记录调用createDirectories之前的时间 Instant beforeCreate = Instant.now(); // 执行创建目录,不管是否已存在 Files.createDirectories(dirPath); // 获取目录的最后修改时间(新创建的目录时间会接近beforeCreate) FileTime dirTime = Files.getLastModifiedTime(dirPath); // 留100毫秒的误差窗口,适配文件系统时间戳精度 if (dirTime.toInstant().isAfter(beforeCreate.minusMillis(100))) { System.out.println("Directory Created"); } } catch (Exception ex) { System.out.println("创建目录时出错: " + ex.getMessage()); } } }
这里设置100毫秒的误差窗口是因为不同文件系统的时间戳精度不一样,避免因为系统时间的微小偏差导致判断错误。这个方法的核心是:不管中间有没有其他进程创建目录,我们只关心“本次调用是否实际创建了目录”,通过时间戳来精准判断。
小提醒
如果你的目录路径最后可能是文件(比如误传了文件路径当目录),记得在代码里加上Files.isDirectory()的判断,避免因为路径是文件导致的异常哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

