案例:
在开发的过程中需要补充一下数据到r2m中,所以需要从resources的根目录下读取txt文件,写了以下代码,具体逻辑如下:
1、用定时任务来执行代码,不掺入到主业务代码中:
/*@Scheduled(cron = "0/30 * * * * ?")*/
public void syncNewConsumeMqData(){
//1、判断是否执行定时任务做插入操作
String infoKey = r2mEntity.getClient().get(idInfoKeyConsume);
log.info("MQ配置文件同步数据infoKey:{}", infoKey);
if (StringUtils.isBlank(infoKey)) {
log.info("结束");
return;
}
//2、从配置文件中获取插入内容
List<RecommondConfigToMqVO> insertData = getFileMessage();
log.info("新消费获取配置文件数据条数:"+insertData.size());
//3、将数据存储到r2m中
if(CollectionUtils.isNotEmpty(insertData)){
int i = 0;
for(int s=0;s<insertData.size();s++){
RecommondConfigToMqVO message = insertData.get(s);
String json = new Gson().toJson(message);
String key = NewConsumerMqListener.NEW_CONSUME+message.getBizCode()+message.getExtBizId()+message.getExtSubBizId();
r2mEntity.getClient().set(key,json);
log.info(String.format("插入数据编号:%s,插入数据key:%s,插入数据:%s", i, key,json));
i++;
}
if(i==insertData.size()){
log.info(String.format("新消费文本文件插入缓存成功:共计-》%s",i));
}else{
log.info(String.format("新消费文本文件插入缓存数据不一致:获取到的数据-》%s,插入成功的数据-》%s",insertData.size(),i));
}
}
//4、删除插入标识key
r2mEntity.getClient().del(idInfoKeyConsume);
log.info("新消费插入r2m操作标识符删除成功!");
log.info(JSON.toJSONString(insertData));
}
2、通过java的IO的字符流读取文件,并通过缓冲流提升读的速度
/**
* 从resource目录下获取表格数据
* @return
*/
private List<RecommondConfigToMqVO> getFileMessage(){
List<RecommondConfigToMqVO> insertData = new ArrayList<>();
InputStreamReader isr = null;
BufferedReader br = null;
try {
InputStream in = this.getClass().getResourceAsStream("/mix.txt");
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String str = "";
while ((str = br.readLine()) != null) {
insertData.add(this.assembleData(str));
}
} catch (FileNotFoundException e) {
log.info("找不到指定文件");
} catch (IOException e) {
log.info("读取文件失败");
} finally {
try {
br.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
return insertData;
}
}
3、将获取到的数据进行拆分然后封装到实体类中
/**
* 输入某一行数据,根据对应关系进行拆分
* 可拆分数据格式 --》4 A241024138932592640 389 "101:100,103:0"
* @param str
* @return RecommondConfigToMqVO
*/
private RecommondConfigToMqVO assembleData(String str){
RecommondConfigToMqVO vo = null;
if(StringUtils.isNotBlank(str)){
vo = new RecommondConfigToMqVO();
String[] s = str.split("\t");
vo.setStatus(1);
vo.setBizCode(s[1]);
vo.setExtBizId(s[2]);
vo.setExtSubBizId(s[3]);
String replace = s[4].replace("\"", "");
String[] configTypeVO = replace.split(",");
List<ConfigTypeVo> configList = new ArrayList<>();
for(int i=0;i<configTypeVO.length;i++){
ConfigTypeVo configType = new ConfigTypeVo();
String[] typeWeight = configTypeVO[i].split(":");
configType.setType(Integer.valueOf(typeWeight[0]));
configType.setWight(Integer.valueOf(typeWeight[1]));
configList.add(configType);
}
vo.setConfigTypeVOList(configList);
}
return vo;
}
以下是参考链接:
https://www.jb51.net/article/102935.htm缓冲流
https://blog.youkuaiyun.com/nightcurtis/article/details/51324105java的IO流
https://blog.youkuaiyun.com/Diamond_Tao/article/details/80010225 Java工程中读取resources目录下properties文件的几种方法(因为要在tomcat上部署,本案例用的是第二种)
https://www.runoob.com/java/java-files-io.html 菜鸟教程