Java 文件监控和数据同步:对比时间戳更新本地 JSON 文件
Java 文件监控和数据同步:对比时间戳更新本地 JSON 文件
该代码实现了一种 Java 文件监控和数据同步机制,通过循环内存中的 Map 数据,对比本地文件时间戳,若不一致则将内存中的数据深拷贝一份,并使用 IO 线程写入本地 JSON 文件。
//3.循环内存中map数据,循环文件目录找map中训练场id/项目id的文件名,若找到对比时间后缀,时间不一致,把Detail数据深拷贝一份,(使用io线程写入文件)将内存中的数据(深拷贝的数据)更新到本地json文件-加锁
private void checkIsUploadAndUpdateFile() {
try {
synchronized (allMapSycTrainMap) {
//1.循环allMapSycTrainMap中数据-加锁
for (Map.Entry<Long, TrainMapData> entry : allMapSycTrainMap.entrySet()) {
Long key = entry.getKey();
TrainMapData value = entry.getValue();
Thread fileCheckThread = new Thread(() -> {
//持续监测指定文件夹中是否有新的文件出现
while (true) {
File folder = new File('D:/mapSycTrain/'); // 本地文件夹路径
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
String[] fileName1 = file.getName().split("-");
String[] fileName2 = fileName1[1].split("\\.");
Long trainingGroundIdByLocal = Long.valueOf(fileName1[0]);//文件训练场ID
Long timeByLocal = Long.valueOf(fileName2[0]);//文件时间版本
//当训练场ID相同时,时间版本不同
if (Objects.equals(key, trainingGroundIdByLocal) && !Objects.equals(value.time, timeByLocal)) {
// 开启新的线程去操作
Thread fileOperationThread = new Thread(() -> {
//把Detail数据深拷贝一份,(使用io线程写入文件)将内存中的数据(深拷贝的数据)更新到本地json文件
List<DetailRouteMapData> detailRouteMapDataList = getDetailRouteMapDataListByTrainingGroundIdOrProjectRouteMapDataId(key);
try {
List<DetailRouteMapData> copiedList = deepCopy(detailRouteMapDataList);
String json = JSON.toJSONString(copiedList);
String filePath = 'D:/mapSycTrain/' + file.getName();
new Thread(new Runnable() {
@Override
public void run() {
try {
// 清空文件内容
FileWriter fileWriter = new FileWriter(filePath, false);
fileWriter.write('');
fileWriter.close();
// 写入JSON字符串到文件
FileWriter fileWriterAppend = new FileWriter(filePath, true);
fileWriterAppend.write(json);
fileWriterAppend.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e);
}
});
fileOperationThread.start();
}
}
}
}
});
fileCheckThread.start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
代码解析:
- 循环内存中的 Map 数据:
allMapSycTrainMap是一个存储训练场 ID 和对应数据的 Map。 - 循环文件目录: 代码使用
File.listFiles()方法获取指定文件夹中的所有文件。 - 对比时间戳: 代码提取文件名中的训练场 ID 和时间版本,并与内存中的数据进行对比。
- 数据深拷贝: 若时间戳不一致,代码使用
deepCopy()方法将内存中的数据深拷贝一份。 - 异步写入文件: 代码使用
FileWriter类写入 JSON 字符串到文件,并使用新的线程来执行写入操作,以避免阻塞主线程。
功能特点:
- 文件监控: 持续监测指定文件夹是否有新文件出现。
- 数据同步: 将内存中的数据更新到本地 JSON 文件,确保数据的一致性。
- 异步操作: 使用多线程来执行文件操作,提高程序性能。
- 加锁机制: 使用
synchronized关键字对allMapSycTrainMap加锁,保证数据同步的安全性。
应用场景:
该代码可用于各种需要文件监控和数据同步的应用场景,例如:
- 实时监控数据变化,并更新本地文件。
- 将内存中的数据持久化到本地文件。
- 在分布式系统中同步数据。
代码优化建议:
- 可以考虑使用更可靠的事件监听机制来实现文件监控,例如使用 Java NIO。
- 可以使用更快的 JSON 库来进行序列化和反序列化。
- 可以对文件写入操作进行错误处理,例如记录日志或重试机制。
- 可以根据实际情况调整代码的性能和并发性。
总结:
该代码提供了一种基本的 Java 文件监控和数据同步机制,可以作为其他应用的参考。在实际应用中,需要根据具体需求进行调整和优化。
原文地址: https://www.cveoy.top/t/topic/qtbo 著作权归作者所有。请勿转载和采集!