62,614
社区成员
发帖
与我相关
我的任务
分享
package com.test.nio;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UrlCount implements Runnable {
private final static String FILE = "/source";
private final static int SIZE = 10000 * 10;
private final static ConcurrentHashMap<String, Integer> urlMap = new ConcurrentHashMap<>();
private final static ExecutorService execute = Executors.newCachedThreadPool();
private long skip;
private long limit;
public UrlCount(long skip, long limit) {
this.skip = skip;
this.limit = limit;
}
public static void sortMap() {
// 频率排序
List<Map.Entry<String, Integer>> sortList = new ArrayList<>(urlMap.entrySet());
Collections.sort(sortList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
// TODO Auto-generated method stub
return o2.getValue().compareTo(o1.getValue());
}
});
//取前100 最多频率
for (int i = 0; i < sortList.size(); i++) {
if (i > 100) {
break;
}
System.out.println("URL:" + sortList.get(i).getKey() + " ---- 出现频率:" + sortList.get(i).getValue());
}
}
@Override
public void run() {
System.out.println(String.format("分析行数:%s - %s", skip, (skip / SIZE + 1) * SIZE - 1));
try {
Files.lines(Paths.get(FILE)).skip(skip).limit(limit).forEach(line -> {
synchronized (urlMap) {
urlMap.put(line, urlMap.containsKey(line) ? urlMap.get(line) + 1 : 1);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
long lines = Files.lines(Paths.get(FILE)).count();
long begin = System.currentTimeMillis();
for (int i = 0; i <= lines / SIZE; i++) {
if (i < lines / SIZE) {
execute.execute(new UrlCount(SIZE * i, SIZE));
} else if (lines % SIZE > 0) {
execute.execute(new UrlCount(SIZE * i, lines % SIZE));
}
}
execute.shutdown();
while (true) {
if (execute.isTerminated()) {
long end = System.currentTimeMillis();
sortMap();
System.out.println("耗时:" + (end - begin) + " 毫秒");
break;
}
}
}
}