获取文件并进行排序

该博客讨论了在平台指定路径下,针对多个同名文件读取可能导致的旧文件被缓存问题。作者提出了按文件创建时间降序排序来确保最新的文件被优先处理的解决方案,并提供了相应的Java代码实现。通过排序,可以更有效地进行文件处理,避免在故障排查时的定位困难。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台指定路径下面文件,正常File文件读取是根据名称进行识别读取。通过读取的文件进行数据缓存利用。潜在问题:同一个文件部署时候(不小心)存在多个,那么出现旧的文件被读取进行缓存,照成排查时候定位非常困难。打算文件进行时间排序(降序),然后进行读取并后续处理

需求说明

在这里插入图片描述
希望排序后,再读取文件
在这里插入图片描述

案例调试

==>【DB】文件相关配置数据,原始排序:FileDb{fileName='DB_262 (1).db', createTime='2022-01-04 06:30:36'}
==>【DB】文件相关配置数据,原始排序:FileDb{fileName='DB_262.db', createTime='2022-01-04 06:29:57'}
==>【DB】文件相关配置数据,原始排序:FileDb{fileName='DB_690.db', createTime='2022-01-04 07:35:28'}

<==【DB】文件相关配置数据,时间排序:FileDb{fileName='DB_690.db', createTime='2022-01-04 07:35:28'}
<==【DB】文件相关配置数据,时间排序:FileDb{fileName='DB_262 (1).db', createTime='2022-01-04 06:30:36'}
<==【DB】文件相关配置数据,时间排序:FileDb{fileName='DB_262.db', createTime='2022-01-04 06:29:57'}

参考代码

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.SimpleDateFormat;
import java.util.*;

@Slf4j
public class test06 {
	@Test
	public void Test01() throws Exception {
		String path = "D:\\usr\\db";
		File sqLiteFile = new File(path);
		if (!sqLiteFile.exists()) {
			sqLiteFile.mkdirs();
		}
		File[] fs = sqLiteFile.listFiles();
		if (fs.length == 0) {
			System.out.println("【" + path + "】下未找到相关配置数据,请参考集成文档【https://baidu.com】");
		}
		List<FileDb> fileDbList = getFileDbList(fs);

		if (fileDbList.size() > 0) {
			fileDbList.stream().forEach(e -> log.info("==>【DB】文件相关配置数据,原始排序:" + e.toString()));
			listSort(fileDbList);
			fileDbList.stream().forEach(e -> log.info("<==【DB】文件相关配置数据,时间排序:" + e.toString()));
			/*for (FileDb file : fileDbList) {
				//缓存业务处理 System.out.println(file.toString());
			}*/
		}
	}

	/**
	 * 根据时间排序(其他排序如根据id排序也类似)
	 *
	 * @param list
	 */
	public static void listSort(List<FileDb> list) {
		Collections.sort(list, new Comparator<FileDb>() {
			@Override
			public int compare(FileDb o1, FileDb o2) {
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				try {
					Date dt1 = format.parse(o1.getCreateTime());
					Date dt2 = format.parse(o2.getCreateTime());
					if (dt1.getTime() < dt2.getTime()) {
						return 1;//大的放前面
					} else {
						return -1;
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				return 0;
			}
		});
	}

	/**
	 * 获取文件名称和创建时间
	 *
	 * @param fs
	 * @return
	 */
	public static List<FileDb> getFileDbList(File[] fs) {
		List<FileDb> fileDbList = new ArrayList<>();
		for (File file : fs) {
			if (!file.getName().toLowerCase().contains(".db")) {
				continue;
			}
			BasicFileAttributes bAttributes = null;
			try {
				bAttributes = Files.readAttributes(file.toPath(), BasicFileAttributes.class);
				String fileName = file.getName();
				// 修改时间 .replace(/\.[\d]{3}Z/
				String changeTime = bAttributes.lastModifiedTime().toString();
				changeTime = changeTime.substring(0, changeTime.lastIndexOf("."));
				changeTime = changeTime.replace("T", " ");
				FileDb fileDb = new FileDb(fileName, changeTime);
				fileDbList.add(fileDb);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return fileDbList;
	}

	/**
	 * @description: 文件
	 * @author: Lucky
	 * @create: 2022-01-04 13:37
	 **/
	public static class FileDb {
		private String fileName;
		private String createTime;

		public FileDb() {
		}

		public FileDb(String fileName, String createTime) {
			this.fileName = fileName;
			this.createTime = createTime;
		}

		public String getFileName() {
			return fileName;
		}

		public void setFileName(String fileName) {
			this.fileName = fileName;
		}

		public String getCreateTime() {
			return createTime;
		}

		public void setCreateTime(String createTime) {
			this.createTime = createTime;
		}

		@Override
		public String toString() {
			return "FileDb{" +
					"fileName='" + fileName + '\'' +
					", createTime='" + createTime + '\'' +
					'}';
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掘金者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值