码迷,mamicode.com
首页 > 其他好文 > 详细

读取大文本文件

时间:2018-10-02 13:50:55      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:output   detail   href   情况   建立   很多   文本   比较   read   

目录

大容量文件读写并统计

https://www.cnblogs.com/outmanx/p/9694493.html
在这个项目的基础上,我稍作了修改,并能让程序进行低占存的大文本文件读写,并统计出行数和出现最多的字符串


#思路

参考https://www.cnblogs.com/zhujiabin/p/5660541.html的思路,通过RandomAccessfile的类方法进行读取文件,会比一般的方法快很多,再用bufferwriter把得到的结果写进txt中


io流的初始化

private static String url = "E:\新建文件夹\something.txt";
private static String nurl = "E:\新建文件夹\output.txt";

RandomAccessFile fis = new RandomAccessFile(url,"r");
BufferedWriter bw = new BufferedWriter(new FileWriter(nurl));

Treemap的建立和读取起点

.//创建treemap树将键值的判断用来得到数值的累积以达到统计的目的
>.TreeMap < String, Integer> tm = new TreeMap<>();
String a = null ;
String g = null;
int getline=0;
//重点,seek方法将文件的起始读取节点
fis.seek(0);

之后为完成分割字符串的功能,我找了很久,找不到完美的方法,最后无可奈何只能把范围限定在英文内,并且必须是以逗号为分割,通过split方法将字符串分开并储存在数组中。

//通过readline方法读取方便又快捷,把读取到的东西赋值给a,创建g字符串将编码改为gbk编码
while((a=fis.readLine())!=null) {
getline++;
g=new String(a.getBytes("ISO-8859-1"), "gbk");
String[] idArr = g.split(",");
String mid = null;
for(int i =0;i < idArr.length;i++) {
mid = idArr[i];
//if的判断来判断键值的累积
if(!tm.containsKey(mid)) {
tm.put(mid, 1);
}
else {
tm.put(mid, tm.get(mid)+1);
}
}
}


判断是否为出现最多

for(String key:tm.keySet()) {
//选择key值,在任意情况下,把得到的数值赋值给sumch,在下一次比较中赋值给sumch1,通过max方法比较大小,如果大就把当前的键值赋值给已经设置好的变量中,此方法的弊端就在于只能够获取其中一个键值,如果有多个字符串出现次数相等,只能得到其中一个
switch (key) {
default:
sumch1=sumch;
sumch=tm.get(key);
maxnum=max(sumch1,sumch);
if(sumch>sumch1) {
akey=key;
}
break;
}
}

结果

由于20mb的文件需要大约3-4分钟时间,所以我随便找了个jar包来读取,由于编码原因,读取到的全是乱码,但读取速度在10s内。并且可以统计最多的字符
技术分享图片
这是通过代码在命令行内得到的结果
技术分享图片

参考

https://www.cnblogs.com/zhujiabin/p/5660541.html RandomAccessfile的使用
https://blog.csdn.net/sun5769675/article/details/50204591 split方法

读取大文本文件

标签:output   detail   href   情况   建立   很多   文本   比较   read   

原文地址:https://www.cnblogs.com/outmanx/p/9736213.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!