读取大文本文件

大容量文件读写并统计

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方法

posted @ 2018-10-02 01:18  atmscp  阅读(446)  评论(1编辑  收藏  举报