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个,无法获取前一日日志"); } } }
代码说明
- 精准筛选日志文件:用正则
^\\d{8}\\.log$严格匹配8位数字日期+.log的格式,同时只筛选文件(排除目录) - 排序保证顺序:通过
Comparator.comparing(File::getName)对文件名升序排序,确保最新的日志在列表末尾,倒数第二个就是前一日的日志 - 安全的文件复制:使用Java NIO的
Files.copy方法,支持覆盖已存在的目标文件,同时处理IO异常 - 边界检查:先判断日志文件数量是否≥2,避免索引越界错误
内容的提问来源于stack exchange,提问作者hm9
相关产品推荐
相关产品推荐

