JavaProject-IP归属地查询

JavaProject-IP归属地查询

1 中小型Java应用项目开发标准流程

1.1、项目概述

准确宏观上描述清楚项目要做什么

1.2、项目分析

确定项目的可行性-能干不能干

1.3、技术方案和开发计划

技术方案:将重难点需求的技术解决方法罗列清楚。
开发计划:什么人、什么时间、做什么事情

1.4、细节开发

coding

1.5、测试Bug修改与系统优化

用TestCase来测试系统问题,并修复
并针对关键环节进行必要的优化提升执行效率。

1.6、项目标准化

将项目的命名、包结构、运维规范等进行公司统一规范化管理。

1.7、正式上线

正式发布,对外提供相应的服务或是Jar包

2 IP归属地查询项目-标准开发流程落地

2.1、项目概述

给定一个IP地址,查询出其所在的归属地信息,即国家、省、市、区、具体位置等信息。

2.2、项目分析

将项目的开发步骤进行详细推敲罗列
1、读取IP地址库的数据
2、将文本数据转化成IP对象型数据,并加入相应的集合。
3、对IP对象集合排序,形成增序集合。
4、编写针对增序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。
5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。
6、测试调优与Bug修复

2.3、技术方案和开发计划

技术方案:
1、读取IP地址库的数据(Java IO)
2、将文本数据转化成IP对象型数据,并加入相应的集合。(Java面向对象、集合操作)
3、对IP对象集合排序,形成增序集合。(Java集合、比较器)
4、编写针对增序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。(对象二分查找算法实现)
5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。(Java IO-System.out)
6、测试调优与Bug修复
测试用例-TestCase
调优分类
计算调优
存储调优
以空间换时间,或是以时间换空间。

开发计划:什么人、什么时间、做什么事情

2.4、细节开发

1、读取IP地址库的数据,形成一个文本行集合。(Java IO)
File
FileInputStream
InputStreamReader
BufferedReader
List
ArrayList

2、将文本数据转化成IP对象型数据,并加入相应的集合。(Java面向对象、集合操作)

3、对IP对象集合排序,形成升序集合。(Java集合、比较器)
业务问题转化成技术问题
先技术解决,后业务应用
冒泡排序
时间时杂度:
计算次数的量级
O(1)
O(log2N)
O(n)
O(nlog2n)
O(n2)
空间复杂度:
O(1)

4、编写针对升序集合的二分查找算法,使之给定一个IP地址可以拿到对应的查询结果。(对象二分查找算法实现)
基本数据类型的二分查找
对象数据类型的二分查找
IPPojo对象类型的二分查找

5、对查询结果进行个性化处理,比如打印、存到文件、存储到数据库等均可。(Java IO-System.out)

6、测试调优与Bug修复
测试用例-TestCase
调优分类
计算调优
存储调优
以空间换时间,或是以时间换空间。

2.5、测试Bug修改与系统优化

用TestCase来测试系统问题,并修复
并针对关键环节进行必要的优化提升执行效率。

2.6、项目标准化

将项目的命名、包结构、运维规范等进行公司统一规范化管理。

2.7、正式上线

正式发布,对外提供相应的服务或是Jar包

3 开发项目注意事项

3.1 数据开发注意事项

数据敏感性

数据洞察:抽样检查和数据统计分析

​ 例如:将文件数据读入集合中时,注意检查是否按照预期正确读入,是否有少读,多读,错读等问题

3.2 硬编码能力

硬编码就是放弃很多的技巧,甚至不讲究技巧,通过自己过硬的编码能力,完全还原自己对一个问题的解决方法

3.3 比较大小的效率

最高的一定是二进制

其次应该是数值型

最后就是非数值型

3.4 测试用例基本原则

边界外测试

边界测试

边界内测试

3.5 数据初始化的时机

系统启动完成前:

​ static方法块

系统启动完成后

​ static还是成员方法均可

3.6 遇到陌生的业务问题的通用解决方法

先解决技术问题

后解决业务问题

4 IP归属地查询开发中的具体问题和解决方法

4.1 在文件操作时文件不存在问题

在文件操作时,必须判断文件是否存在以及是否是文件,否则输入文件路径不存在时就会出现异常

File file = new File(pathString);
// 判断是否是文件以及文件是否存在
if (file.isFile() && file.exists())

4.2 导入数据编解码格式不一致的问题

在编写IO流的时候加上转换流,指定指定的编解码格式

// 创建转换流,统一设置编码格式
InputStreamReader isr = new InputStreamReader(
    new FileInputStream(file), "utf-8");
// 创建缓冲流
BufferedReader br = new BufferedReader(isr);

4.3 文件操作按行读取文件时空行问题

在用readLine()方法按行读取文本文件时,最好进行边界检验,防止出现读入空行或者出现异常

while ((lineText = br.readLine()) != null) {
// 边界检验
if (lineText == null || lineText.trim().length() == 0) {
continue;}

4.4 流操作中文件已打开问题

在流操作过程中,如果完成流操作不把流关闭,那么此时再操作文件就会出现异常

// 关闭所有流
br.close();

4.5 存储的数据结构选择问题

因为此次项目重点是运用查找和排序快,想要实现方便而且查找效率高的话,建议选择数组或ArrayList集合,其中数组的内存是连续的,查找效率高,且ArrayList和数组有下标,为使用二分法查找和冒泡排序提供遍历

4.6 Object集合排序实现问题

必须让Object类对象实现comparable接口或者实现comparator的继承类,重写compareTo方法即可调用Collections.sort(List)方法进行排序

//实现comparable接口
public class IP implements Comparable<IP>
// 重写compareTo方法实现排序
	@Override
	public int compareTo(IP ip) {
		long temp = this.longIPStart - ip.longIPStart;
		return temp > 0 ? 1 : (temp < 0 ? -1 : 0);
	}
// 调用方法将文本集合转换为对象集合
		ArrayList<IP> IPList = textListToipList(textList);
		// 对对象集合进行排序
		Collections.sort(IPList);

4.7 集合转换为数组问题

在集合转换为数组的时候,强制转换会导致出现异常,所以我认为最好的方法是运用集合的toArray方法进行转换

IP[] IPArr = new IP[0];
		// 将集合转换为数组
		IPArr = IPList.toArray(IPArr);

注意:

在使用toArray方法前,必须先定义一个相关的数组传入,否则会出现转换失败,在创建数组时,容量低于集合的容量会自动扩充,容量高于集合的容量时会从前往后填充数据,剩余的空间填充null

4.8 递归查找问题

在进行递归的时候必须明确终止条件和递归条件,否则递归就会出现问题

4.9 switch(OP)键盘获取OP输入错误问题

在定义OP的类型时,最好定义为字符串类型,如果定义为基本数据类型,那么输入小数或者字符串时会直接报错,如果是字符串类型那么可以在switch中再进行判断处理

5 项目优化

5.1 如何对项目进行优化

​ 包括计算性能和存储性能
​ 性能优化一般是指响应时间优化,也就是计算性能优化,即如何响应的又快又好。

5.2 优化思路

1、找到系统计算性能瓶颈
对系统运行进行解耦操作,分析出几个重要的核心计算模块以及其当下的运行时间。
本系统步骤:
(1、读文件
(2、转成对象集合
(3、排序
(4、转换成数组
(5、查找
2、针对具体瓶颈问题,进行具体分析和解决方案制定
3、需要对瓶颈问题进行迭代发现和处理
4、进行性能优化总结

5.3 性能优化技巧

直接优化
算法层面硬优化
间接优化
预计算
缓存计算结果
序列化环节优化
减少文件大小
提高IO效率

编解码优化

​ 采用base64等等

用户体验优化

​ 相关参数配置文件化

相关资源链接: https://download.csdn.net/download/simplelove0519/20214867

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,我们可以使用第三方库来获取 IP归属地信息。其中一个常用的库是 GeoIP2,它基于 MaxMind 的 GeoIP2 数据库。 首先,需要将 GeoIP2 库添加到项目中。可以在 Maven 或 Gradle 构建脚本中添加相应的依赖项。 然后,我们可以使用 GeoIP2 提供的 API 来查询 IP归属地。以下是一个示例代码: ```java import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.model.CityResponse; import com.maxmind.geoip2.record.Country; import java.io.File; import java.io.IOException; import java.net.InetAddress; public class IPUtils { public static String getIPCountry(String ip) { try { File database = new File("GeoIP2-City.mmdb"); DatabaseReader reader = new DatabaseReader.Builder(database).build(); InetAddress ipAddress = InetAddress.getByName(ip); CityResponse response = reader.city(ipAddress); Country country = response.getCountry(); return country.getName(); } catch (IOException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String ip = "123.456.789.0"; String country = getIPCountry(ip); System.out.println("IP " + ip + " 的归属地是:" + country); } } ``` 在上述示例中,我们通过 `getIPCountry` 方法传入一个 IP 地址,并在 `main` 方法中调用该方法来获取该 IP归属地信息。具体的归属地信息包括国家、地区、城市等,可以根据需要进行扩展和处理。 需要注意的是,在运行代码之前,我们需要下载并导入 GeoIP2 数据库文件 `GeoIP2-City.mmdb`,该文件包含了 IP 地址和归属地信息的映射关系。可以从 MaxMind 的官网或其他数据源获取该文件。 这样,我们就可以通过 Java 来获取 IP归属地信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值