`
hcmfys
  • 浏览: 356207 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 大文件ip 统计

 
阅读更多

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

public class IpStats {

	private String saveDir;
	public final static String CRLF = "\r\n";

	/**
	 * 读取IP
	 * 
	 * @param fileName
	 */
	public void readIp(String fileName) {
		try {
			BufferedReader reader = new BufferedReader(new FileReader(fileName));
			HashMap<String, String> mapListHashMap = new HashMap<String, String>();
			int  lineSize=0;
			//RandomAccessFile rndAccessFile=new RandomAccessFile(new File(fileName),"r"  );
			while (true) {
				String line = reader.readLine();
				if (line == null) {
					break;
				}
				 

				long ipCounts = getIpCount(line);
				if (ipCounts != -1) {
					long rnd = ipCounts % 1024;
					String toFileName = rnd + ".dat";
					///System.out.println(" parpare write to file "  +toFileName );
					String strContent = mapListHashMap.get(toFileName);
					if (strContent != null) {
						strContent += line + CRLF;
						mapListHashMap.put(toFileName, strContent);
					} else {
						mapListHashMap.put(toFileName, line + CRLF);
					}
					lineSize++;
					
				}
				
				if (lineSize >= 10000) {
					Set<String> sets = mapListHashMap.keySet();
					for (String sFileName : sets) {
						write2IpFile(sFileName, mapListHashMap.get(sFileName));
						//System.out.println("write to file "  +sFileName);
					}
					System.out.println("write to file length "  + lineSize );
					lineSize=0;
					mapListHashMap.clear();
				}

				

			}
			reader.close();
			
			Set<String> sets = mapListHashMap.keySet();
			 
			for (String sFileName : sets) {
				write2IpFile(sFileName, mapListHashMap.get(sFileName));
				System.out.println("write to file "  +sFileName);
			}
			mapListHashMap.clear();
			System.out.println("read ip complete  ");
		} catch (Exception e) {

			e.printStackTrace();
		}

	}

	/**
	 * 
	 * @param ipCountMap
	 */
	private List<ListItem> sort(HashMap<String, Long> ipCountMap) {

		Set<String> sets = ipCountMap.keySet();
		List<ListItem> ipList = new ArrayList<ListItem>();

		for (String ip : sets) {
			ListItem item = new ListItem();
			item.setIp(ip);
			item.setIpCounts(ipCountMap.get(ip));
			ipList.add(item);
		}
		System.out.println("sort ..." + ipCountMap);
		Collections.sort(ipList, new Comparator<ListItem>() {

			@Override
			public int compare(ListItem o2, ListItem o1) {
				if (o1.getIpCounts() - o2.getIpCounts() >= 1) {
					return 1;
				} else if (o1.getIpCounts() - o2.getIpCounts() == 0) {
					return 0;
				}
				return -1;
			}
		});
		return ipList;

	}

	/*
	 * read top 10 ip
	 */
	private void readTop10(File file) {
		try {
			int index = 0;
			BufferedReader reader = new BufferedReader(new FileReader(file));
			while (true) {
				String line = reader.readLine();
				if (line == null) {
					break;
				}
				if (index > 10) {
					break;
				}
				index++;
				System.out.println(line);

			}
			reader.close();
			
			file.renameTo(new File(saveDir+"result.txt"));
		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	/*
	 * start Stat SimpleFile
	 */
	public void startWork(String dir) {
		File[] files = new File(dir).listFiles(new FileFilter() {

			@Override
			public boolean accept(File pathname) {

				return pathname.getName().endsWith(".dat");
			}
		});
		for (File file : files) {
			System.out.println("stat file ... " + file.getAbsoluteFile());
			statFile(file.getAbsolutePath());
			System.out.println("stat file ... " + file.getAbsoluteFile()+ " end ---");
		}
		File lastFile;
		while (true) {
			File[] curFiles = new File(dir).listFiles(new FileFilter() {

				@Override
				public boolean accept(File pathname) {

					return pathname.getName().endsWith(".cout");
				}
			});

			if (curFiles.length == 1) {
				lastFile = curFiles[0];
				break;
			} else {
				System.out.println("mereFile file ... "
						+ curFiles[0].getAbsolutePath());
				Merge.mereFile(saveDir, curFiles[0].getAbsolutePath(),
						curFiles[1].getAbsolutePath());

				System.out.println("mereFile end -- "
						+ curFiles[0].getAbsolutePath());
			}
		}
		System.out.println("stat file  complete ");
		readTop10(lastFile);

	}

	/*
	 * stat file
	 */
	private void statFile(String fileName) {
		HashMap<String, Long> ipCountMap = new HashMap<String, Long>();
		try {
			File curFile = new File(fileName);
			BufferedReader reader = new BufferedReader(new FileReader(curFile));
			while (true) {
				String line = reader.readLine();
				if (line == null) {
					break;
				}
				Long counts = ipCountMap.get(line);
				if (counts == null) {
					ipCountMap.put(line, Long.parseLong("1"));
				} else {
					long couts = counts.longValue() + 1;
					ipCountMap.put(line, Long.parseLong(couts + ""));
				}
			}
			reader.close();

			Set<String> sets = ipCountMap.keySet();
			String sName = new File(fileName).getName();
			int index = sName.indexOf(".");
			if (index != -1) {
				sName = sName.substring(0, index);

			}
			sName = sName + "_counts.cout";
			List<ListItem> ipList = sort(ipCountMap);
			for (ListItem ipItem : ipList) {
				write2IpFile(sName,
						ipItem.getIp() + "\t" + ipItem.getIpCounts() + CRLF);
			}
			//curFile.renameTo(new File(curFile.getAbsolutePath() + "-old"));
			 curFile.delete();
		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	/*
	 * write to ip file
	 */
	private void write2IpFile(String fileName, String ipContent) {
		try {
			String filePath = saveDir + fileName;
			BufferedOutputStream fout = new BufferedOutputStream(
					new FileOutputStream(new File(filePath), true));
			fout.write(ipContent.getBytes());
			fout.close();
		} catch (Exception e) {

			e.printStackTrace();
		}

	}

	/**
	 * get ipcounts
	 * 
	 * @param ip
	 * @return
	 */
	private long getIpCount(String ip) {
		long ipcounts = 0;

		String[] ipArr = ip.split("\\.");
		if (ipArr.length != 4) {

			return -1;
		}
		ipcounts = 256 * 256 * 256 * Integer.parseInt(ipArr[0]) + 256 * 256
				* Integer.parseInt(ipArr[1]) + 256 * Integer.parseInt(ipArr[2])
				+ Integer.parseInt(ipArr[3]);
		return ipcounts;

	}

	/*
	 * 
	 * hcmfys@163.com tomjnefu 2013-07-13
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		IpStats stat = new IpStats();
		/*
		 * 测试文件夹 d:/bigfiles/ big.txt 为 2G的大文件
		 */
		String saveDir = "d:/bigfiles/";
		stat.setSaveDir(saveDir);
		stat.readIp("d:/bigfiles/big.txt");
		stat.startWork(saveDir);
	}

	public void setSaveDir(String saveDir) {
		this.saveDir = saveDir;
	}

	public String getSaveDir() {
		return saveDir;
	}

}








分享到:
评论

相关推荐

    java开发-IP解析方案-最新GeoIP2与IP2LOCATIO与dbIP离线数据库文件

    在实际应用中,这些离线数据库文件通常以二进制格式存储,为了便于Java程序读取,需要先将其加载到内存或者持久化到本地数据库。在解压提供的“最新Geo与IP2LOCATION”压缩包后,开发者应根据所选择的数据库类型,...

    Java获取ip所在地区

    总的来说,通过Java获取IP所在地区涉及到网络编程、二进制文件解析以及数据库操作等多个技术点。正确理解和实现这一过程,可以帮助我们在各种应用场景下,如网站访问统计、网络安全分析等,更好地处理与IP地址相关的...

    用IP统计网站流量(java)

    本教程将详细讲解如何使用Java实现这一功能,特别是在标题和描述中提到的“用IP统计网站流量”。 首先,我们要明白统计网站流量的基本概念。网站流量主要包括三个方面:在线人数、总访问量和总的页面访问量。在线...

    用Java实现对IP/TCP协议数据包的拦截和分析

    5. **数据包过滤与统计**: 可以根据需求设置过滤规则,例如只分析特定源IP或目的IP的数据包,或者统计特定端口上的流量。这有助于我们进行网络性能分析和安全监控。 6. **异常检测与安全应用**: 分析IP/TCP数据包...

    网站在线IP统计

    网站在线IP统计是一种重要的网络分析工具,用于追踪和分析访问网站的独立IP地址数量,以了解网站的流量、用户来源和活动情况。在互联网行业中,这样的统计对于网站优化、市场策略制定以及用户行为研究具有重要意义。...

    java读取纯真IP数据库QQwry.dat的源代码--获取ip所在地区

    QQwry.dat是一种广泛使用的IP地址库,它包含了大量的IP地址及其地理位置信息,通常用于网络日志分析、网站访问统计、地理位置定位等场景。下面将详细介绍如何编写Java源代码来读取这个数据库。 首先,理解QQwry.dat...

    JAVA 统计网站的访问量PV,UV

    这里我们主要探讨如何使用Java,Spring框架以及MySQL数据库来实现对网站的PV(页面浏览量)和UV(独立访客数)的统计。首先,我们需要了解这两个概念: 1. PV(页面浏览量):每次页面加载或刷新都会被计算为一次PV...

    ip查询归属地收藏 Java 查询IP地址

    根据给定的文件信息,我们可以总结出以下关于“IP查询归属地”以及使用Java进行IP地址查询的关键知识点: ### IP地址基础知识 IP地址是互联网协议(Internet Protocol)地址的简称,用于唯一标识网络上的设备。它由...

    java解析IP库获取对应中文省市及运营商(IP数据截止2014年10月)

    在Java中解析这个库,主要是为了实现IP地址到地理位置信息的快速查询,这在诸如网站访问统计、网络安全分析、广告定向投放等领域都有广泛的应用。 1. **解析IP库**:首先,我们需要将纯真IP库的文本文件加载到内存...

    利用纯真IP数据库,通过IP查地址[JAVA]

    4. **随机访问文件类`RandomAccessFile`的应用**:掌握如何使用`RandomAccessFile`类读取大文件并定位特定记录。 #### 二、纯真IP数据库简介 纯真IP数据库是一款由国内开发者开发的免费开源IP数据库,它可以用于...

    JAVA获取别人的ip地址

    这不仅可以用于日志记录、统计分析,还可以用于某些安全控制措施,例如限制某些IP访问服务等。本文将详细介绍如何通过Java编程语言实现一个简单的程序来获取客户端的IP地址。 #### 二、核心知识点解析 ##### 1. ...

    根据IP地址获取经纬度

    GeoIPJava库是用于Java环境的接口,可以读取MaxMind的二进制数据库文件,获取IP地址对应的位置信息。 3. **GeoIPJava-1.2.8**:这是特定版本的Java库,可能包含了一些API方法,如`GeoIPService`或`GeoIP2`,用于...

    java基于xml实现网站访问量统计

    Java基于XML实现网站访问量统计是一种常见的Web应用监控方法,主要通过解析XML文件来记录和分析网站的访问数据。在不改动数据库的情况下,这种技术提供了一种轻量级且易于集成的解决方案。以下是对这个主题的详细...

    java编译后的文件上传至linux服务端

    在本地开发环境中,我们通常使用JDK(Java Development Kit)中的javac命令来编译源代码(.java文件),生成字节码文件(.class文件)。例如,对于一个名为`HelloWorld.java`的源文件,我们可以执行`javac Hello...

    ip2region地址库

    ip2region广泛应用于各种需要快速定位IP地址场景,如网络安全分析、网站访问统计、广告定向投放、反欺诈检测等。通过对用户IP的精准定位,企业可以更好地了解用户分布,优化服务,提升用户体验。 六、性能优化与...

    对不同的ip进行访问次数统计.rar

    本案例聚焦于"对不同的IP进行访问次数统计",这是一个典型的日志分析应用场景,主要涉及到网络编程和服务器端技术,如Servlet过滤器(Filter)。 Servlet是Java EE中用于构建Web应用程序的一种核心组件,它允许...

    java读取qqwry.dat实现IP地域查询

    在Java中,我们可以利用文件流和二进制读取方式来解析这个数据文件,从而快速地将IP地址转化为实际的地理位置。 首先,理解qqwry.dat文件的结构至关重要。它是一个二进制文件,由多个IP段记录组成,每个记录包含...

    纯真IP地址查询(Java版源代码)

    在压缩包中的文件“IPSeeker”很可能是一个Java类文件或者包含此类文件的目录,它是整个IP查询系统的核心部分,负责读取QQWry.dat文件并执行IP查询操作。可能包括解析数据库、查找IP地址、返回地理位置等关键功能。 ...

Global site tag (gtag.js) - Google Analytics