Java大文件-分批次读取-计数器

        在Java读取一些较大的文件时,为了避免读取的流和存放数据的对象过大而导致OOM,可以采用分段读取的方式,按照自己定义的每段最大执行数,进行入库。

        以下是一个示例

        1.使用try-with-resources的方式,确保流被正确关闭,因为它是实现了AutoCloseable接口的资源

        2.使用BufferedReader进行缓存,并逐行读取,减少内存消耗.

package com.epidemic.report.util;

import cn.hutool.json.JSONUtil;

import javax.swing.text.html.parser.Entity;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * <Description> ******
 *
 * @author yuSen.zhang
 * @version 1.0
 * @date 2023/03/21
 */
public class FileIORead {
    
    public static final int INSERT_MAX_NUM = 1000;

    public void readFileToEntityAndSave() {
        //isFirstInsert = 是否为第一次入库操作
        boolean isFirstInsert = Boolean.TRUE;
        String line;
        try (FileInputStream fis = new FileInputStream(new File("C:\\你的文件全路径"));
             BufferedReader br = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))) {
            //起始数
            int startNums = 0;
            StringBuilder builder = new StringBuilder();
            while ((line = br.readLine()) != null) {
                builder.append(line).append(System.lineSeparator());
                startNums++;
                if (startNums == INSERT_MAX_NUM) {
                    //本次取到的分段字符去执行你的业务逻辑操作
                    coverTxtAndSave(builder.toString(), isFirstInsert);
                    //清空builder
                    builder.setLength(0);
                    //开始下一个分段
                    startNums = 0;
                    //表示不是第一次入库
                    isFirstInsert = Boolean.FALSE;
                }
            }
            if (startNums > 0) {
                coverTxtAndSave(builder.toString(), isFirstInsert);
            }
        } catch (Exception e) {
            //可自行进行异常处理
            System.out.println(e.getMessage());
        }
    }


    private void coverTxtAndSave(String data, boolean isFirstInsert) {
        //伪代码 这里转为什么数据,由实际业务场景决定
        List<Entity> entities = JSONUtil.toList(JSONUtil.parseArray(data), Entity.class);

        //如果不是全量入库的话,这行代码可以删除
        if (isFirstInsert) {
            yourService.remove(new QueryWrapper<>());
        }

        //执行本次批量入库操作
        yourService.saveBatch(entities);
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值