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

Java实现复制目录中倒数第二个yyymmdd格式日志文件

解决方案:获取并复制前一日的日志文件

我来帮你完善这段代码,实现复制前一日日志文件的功能。先梳理下原代码里的几个问题,再给出完整的可运行方案:

原代码的问题点

  • 正则表达式不符合yyymmdd.log的格式要求,无法准确筛选目标日志文件
  • 语法错误:Matcher对象声明时少了赋值符号=
  • 没有对筛选后的文件进行升序排序,无法保证倒数第二个文件就是前一日的日志
  • 文件筛选逻辑冗余,没必要用find()再比对文件名,直接用matches()即可

完整修正代码

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;

class LogFileCopier {
    public static void main(String[] args) {
        // 日志文件所在目录
        File folder = new File("d:\\");
        // 匹配yyymmdd.log格式的正则:8位数字+.log
        Pattern logPattern = Pattern.compile("^\\d{8}\\.log$", Pattern.CASE_INSENSITIVE);
        List<File> logFileList = new ArrayList<>();

        // 筛选符合格式的日志文件
        File[] listOfFiles = folder.listFiles();
        if (listOfFiles != null) {
            for (File file : listOfFiles) {
                // 只处理文件(排除目录),且文件名匹配格式
                if (file.isFile() && logPattern.matcher(file.getName()).matches()) {
                    logFileList.add(file);
                }
            }
        }

        // 按文件名升序排序(因为文件名是日期格式,字符串排序和日期顺序一致)
        logFileList.sort(Comparator.comparing(File::getName));

        // 检查是否有至少2个日志文件(否则没有前一日的日志)
        if (logFileList.size() >= 2) {
            // 获取倒数第二个文件(即前一日的日志)
            File targetLog = logFileList.get(logFileList.size() - 2);
            // 构造复制后的文件名:比如20180113.log_copy
            File copiedFile = new File(targetLog.getParent(), targetLog.getName() + "_copy");

            try {
                // 执行文件复制,覆盖已存在的同名文件
                Files.copy(targetLog.toPath(), copiedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
                System.out.println("复制成功:" + targetLog.getName() + " -> " + copiedFile.getName());
            } catch (IOException e) {
                System.err.println("复制失败:" + e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.out.println("目录下符合格式的日志文件不足2个,无法获取前一日日志");
        }
    }
}

代码说明

  1. 精准筛选日志文件:用正则^\\d{8}\\.log$严格匹配8位数字日期+.log的格式,同时只筛选文件(排除目录)
  2. 排序保证顺序:通过Comparator.comparing(File::getName)对文件名升序排序,确保最新的日志在列表末尾,倒数第二个就是前一日的日志
  3. 安全的文件复制:使用Java NIO的Files.copy方法,支持覆盖已存在的目标文件,同时处理IO异常
  4. 边界检查:先判断日志文件数量是否≥2,避免索引越界错误

内容的提问来源于stack exchange,提问作者hm9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:39:35