java分段读取txt文件??

Super_King_ 2019-05-21 04:43:05
txt文件中有100万手机号码,java怎样分段读出来(用这个读BufferedReader reader),每段1万个,每读出一段以后对这段号码进行操作(比对入库),求大神帮忙!
...全文
817 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Super_King_ 2019-06-11
  • 打赏
  • 举报
回复
引用 12 楼 一叶一追寻ᝰ 的回复:
看你这不是放到list里了嘛.判断下list大于等于1W的时候入库.当小于1W的时候肯定是读完了,在while循环后面加上一段入库不就OK了


嗯嗯 是这么解决的
游北亮 2019-05-22
  • 打赏
  • 举报
回复
代码你都写出来了,无非就是size判断,有什么问题?

while ((lineTxt = reader.readLine()) != null) {
    //判断手机号是否合法
    if (PhoneUtil.isMobileNO(lineTxt)) {
        mobileList.add(lineTxt);
        
        if(mobileList.size() > 10000){
            partialImport(mobileList, custGroupId);
            mobileList.clear();// 清空
        }
    }
}

Super_King_ 2019-05-22
  • 打赏
  • 举报
回复
别沉 求大神回答
一叶一追寻ᝰ 2019-05-22
  • 打赏
  • 举报
回复
看你这不是放到list里了嘛.判断下list大于等于1W的时候入库.当小于1W的时候肯定是读完了,在while循环后面加上一段入库不就OK了
Super_King_ 2019-05-22
  • 打赏
  • 举报
回复
引用 8 楼 水边2 的回复:
根据文件大小,就能估算出大概多少行,
一个手机号11位+换行=13个字节

1万个就约等于 13万字节=130kb了。

现在逻辑乱了 不知道该怎么用总行数判断分段读取了 大神麻烦帮帮忙 感谢代码贴在上面了,就想让每读到10000条的时候去操作别的,然后操作完继续读取 ,直到读取完
Super_King_ 2019-05-22
  • 打赏
  • 举报
回复
// list分段
long size = readLine(fileurl);//总行数
long flag = 10000;//每次取的数据
long temp;//分为几段
int number = 1;
boolean special = size % flag == 0;
if (special) {
temp = size / flag;
} else {
temp = size / flag + 1;
}
long start3 = System.currentTimeMillis();
System.err.println("总行数读取耗时(毫秒):" + (start3 - start2));
URL url = new URL(fileurl);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

List<String> mobileList = new ArrayList<>();
String lineTxt = null;
while ((lineTxt = reader.readLine()) != null) {
//判断手机号是否合法
if (PhoneUtil.isMobileNO(lineTxt)) {
mobileList.add(lineTxt);
}
//匹配出的手机号分批次存入客户群用户表中(1万一批次)
if (temp == number) {
partialImport(mobileList, custGroupId);
mobileList.clear();// 清空
}else {
if (temp > 1) {
if (mobileList.size() > flag-1) {
partialImport(mobileList, custGroupId);
mobileList.clear();// 清空
number++;
}
}
}
}

reader.close();
Super_King_ 2019-05-22
  • 打赏
  • 举报
回复
引用 8 楼 水边2 的回复:
根据文件大小,就能估算出大概多少行,
一个手机号11位+换行=13个字节

1万个就约等于 13万字节=130kb了。



我没估算直接取得行数,但是现在我怕逻辑乱了,你能帮我看下么
游北亮 2019-05-22
  • 打赏
  • 举报
回复
根据文件大小,就能估算出大概多少行, 一个手机号11位+换行=13个字节 1万个就约等于 13万字节=130kb了。
Super_King_ 2019-05-22
  • 打赏
  • 举报
回复
引用 6 楼 水边2 的回复:
代码你都写出来了,无非就是size判断,有什么问题?

while ((lineTxt = reader.readLine()) != null) {
//判断手机号是否合法
if (PhoneUtil.isMobileNO(lineTxt)) {
mobileList.add(lineTxt);

if(mobileList.size() > 10000){
partialImport(mobileList, custGroupId);
mobileList.clear();// 清空
}
}
}

当读出来的数据不到10000的时候呢,我是不是要先全读下来看他有多少行,然后根据总行数再来判断到10000时候操作,如果全读下来是不是很慢?
Super_King_ 2019-05-21
  • 打赏
  • 举报
回复

//转成OSS地址
Credentials credentials = SessionHelper.getOssToken();
String fileurl = OSSClientHelper.getFileUrl(credentials, custGroup.getFileKey());

long start2 = System.currentTimeMillis();
System.err.println("oss转换耗时(毫秒):" + (start2 - start1));
try {
URL url = new URL(fileurl);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));

List<String> mobileList = new ArrayList<>();
String lineTxt = null;
while ((lineTxt = reader.readLine()) != null) {
//判断手机号是否合法
if (PhoneUtil.isMobileNO(lineTxt)) {
mobileList.add(lineTxt);

}
}
reader.close();

long start3 = System.currentTimeMillis();
System.err.println("读取数据耗时(毫秒):" + (start3 - start2));

//读取出来的手机号分批次存入临时表中(1万一批次)
if (mobileList.size() > 0) {
partialImport(mobileList, custGroupId);
}

} catch (Exception e) {
MedChatLogger.error("读取文件内容出错");
e.printStackTrace();
}
Super_King_ 2019-05-21
  • 打赏
  • 举报
回复
引用 2 楼 水边2 的回复:
这个很简单啊,关键是你的txt文件格式长啥样


就是全是手机号 一行一条 每读到10000条的时候去操作别的,然后操作完继续读取 ,知道读取完
游北亮 2019-05-21
  • 打赏
  • 举报
回复
这个很简单啊,关键是你的txt文件格式长啥样
沁海棠 2019-05-21
  • 打赏
  • 举报
回复
只是手机号么? 可以指定跳过多少字符啊. 数据一行一条吧? 可以读一万行,操作完再继续读呀

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧