说一下大体思路
首先无脑读取文件
定义文件路径
通过节点流对接到文本上
将节点流转换为字符流
通过缓冲流对接到输入流
读取
关闭流
文本文件读取工具类
工具类封装 :
1 先写测试类,确认输入与输出技术问题
2 抽象出了输入与输出,形成方法的入参和出参
3 工具代码实现,测试
数据结构化
1 可以找无结构化数据的组织规则,进行抽象,转换为结构化
2 根据数据组织进行数据抽象
3 解析数据,保存到对应的对象中
抽象pojo类
抽象封装
结构化实体类
数据拆分,转换为对象
封装DataProcessManager类
把数据封装到对象中并保存list里面
结构化集合转换为数组
对象数组排序
实现排序
排序注意事项
被排序的元素必须具有可比性
实现Comparable接口
有比较器类Comparator
业务问题
由于IP是字符串,而字符串比较ASCII码
比如 1.1.6.32 , 1.1.128.23 理论上应该是后面的大
但是按照ASCII码比较的话,前面的大
所以我们需要把IP转换为long类型进行比较即可
Pojo添加衍生字段
实体类中衍生两个字段,用来存储转换为long类型之后的值
封装方法,测试
二分法
二分法查询,必须建立在已排序的基础上
基本类型
引用/复杂类型
业务类实现
IP地址对象的范围形式数据的二分法实现
业务类功能实现
工具类封装
到目前为止,已经把二分法搞定了,已经可以实现功能了,测试代码就相当于客户端
但是目前客户端知道的信息还是比较多,客户只关心 入参和出参是什么就可以
至于我们用什么编码,用什么存储,客户根本不关心
此时我们需要提供一个对外访问的方法,该方法入参就是IP 出参就是归属地
优化
功能实现了,像以下情况,同一个生命周期中,如果操作两次及两次以上
那么 会导致 ip_location_relation地址库被解析多次,并且结构化多次,并且排序多次带来的性能变弱
因为在一个生命周期当前,只解析一次,结构化一次,排序一次即可,每次获取归属地的时候,只需 要进行二分法操作即可
可以使用静态代码块解决
入口类,给一个入口运行
BUG优化
用户输入 需要严格校验,比如IP地址不正确,还有必要去查询吗?
技术问题
正则表达式
Pattern和Matcher
Pattern是正则表达式引擎
Matcher是匹配器
Matches : 全词匹配
Find : 任意位置
lookingAt : 从前往后匹配
封装、测试工具类
性能调优
相关技术
硬件
内存,CPU.磁盘,网络等 都可以实现性能提高
软件
直接调优
哪里慢,就调哪里,不需要花里胡哨的
主要指算法问题,内核层面,难度较大,大部分都是非直接调优
迂回调优
通过设计,策略,可以通过不用面对底层优化的难题
迂回调优方向
缓存策略
通过添加时间断点,测试得出,结构化耗时较多
一开始,我们一次运行中,先后校验两个IP,需要结构化两次
后来我们使用静态语句块解决了这个问题
做到一次生命周期中,只会结构化一次
现在面临的问题是,需要让多次生命周期,使用同一个结构化之后的对象,就可以解决当前的问题
可以使用序列化和反序列化解决
序列化和反序列化
序列化 : 将内存中对象保存到硬盘中
反序列化 : 把硬盘中对象载入到内存
首次调优
技术问题
被序列化的对象必须实现serlizable接口
封装、测试工具类
初始化优化
只有第一次才序列化,其余的都反序列化即可
判断该文件是否存在,如果存在,就反序列化获取,如果不存在,就序列化写出
IO调优
加入序列化和反序列化之后,导致效率更低,并且第二个运行要比第一次还慢,说明反序列化有问题
缓冲流 : 缓冲流是IO流的缓冲区,用来提高IO的效率
引入缓冲流
调用处更改
代码标准化
代码中,出现了好多这些变量,当我们需要更改某一个的时候,不好找
集中管理
StaticValue
优化进阶
IO优化
直接优化 : 提高IO效率
间接优化 : 数据大小也会应该效率问题
文件大小变动
首次2500 非首次 520-600
以上就是全部的整体思路,主要就是把以前所学过的知识串联起来,比较有挑战性