public class test{
public static void main(String[]args){
File file =new File ("d:/data.txt"); //读文件,可以统计文件长度
BufferedReader br =new BufferedReader(new FileReader("d:/data.txt"));
long len=file.length(); //文件的总字符长度
long avg=len/5; //分五个线程来计算
List<Long> locate=new ArrayList<>(); //定义集合存储定位
locate.add(0L); //初始第一个
long curpos=0; //当前游标的位置
while((curpos+avg)<len){ //小于文章长度就可以一直遍历
curpos+=avg;
br.skip(avg); //跳过avg的长度
int read=br.read();//跳完之后读下一个字符
curpos++; //游标也向下走一个
while(read!=13&&read!=32&&read!=-1){//这个代表没有读到空格,回车跟结尾
read=br.read();
curpos++; //主要没读到就一直读,直到满足条件了就退出
}
locate.add(curpos);
}
locate.add(len);
//现在需要五个线程分别计算,可以定义集合来存储
List<Map<String,Integer>> list=new ArrayList<>();
for(int i=0;i<5;i++){
list.add(new HashMap());
}
//开启线程池,开五个线程
ExecutorService pool=Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
final int flag=i;
pool.execute(()->{
BufferedReader br1=new BufferedReader(new FileReader("d:/data.txt"));
char[] arr=new char[(int)(locate.get(flag+1)-locate.get(flag))];
br1.skip(locate.get(flag));
br1.read(arr);
String str=new String(arr);
String [] infos =str.split("\\s+"); //将字符串切割,去除所有的空白字符
for(String word:infos){ //遍历切割后的信息
if(list.get(flag).containsKey(word)){ //在集合中已经存在了
list.get(flag).put(word,list.get(flag).get(word)+1);
}else{ //之前还没有
list.get(flag).put(word,1);
}
}
});}
//关闭线程池
pool.shutdown();
while(!pool.isTerminated());
//做最后的count
Map<String,Integer> res=new HashMap();
for(Map<String,Integer> sub:list){ //外层循环
for(String key:sub.keySet()){
if(res.containsKey(key)){ //这个代表以及存在了
res.put(key,res.get(key)+sub.get(key));
}else{
res.put(key,sub.get(key));
}
}
}
System.out.println(res);
}
}
Java简易写法WordCount
最新推荐文章于 2023-08-31 16:43:08 发布