You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:44:32