java的io流介绍和从resources目录下读取文件案例代码

案例:
在开发的过程中需要补充一下数据到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.csdn.net/nightcurtis/article/details/51324105java的IO流
https://blog.csdn.net/Diamond_Tao/article/details/80010225 Java工程中读取resources目录下properties文件的几种方法(因为要在tomcat上部署,本案例用的是第二种)
https://www.runoob.com/java/java-files-io.html 菜鸟教程

你可能感兴趣的:(知识点)