2021.11.12 晴
相较于昨天,所做出的优化:
package practice03.controller;
import java.util.Scanner;
import practice03.manager.DataProcessManager;
/**
* 程序入口
*
*/
public class SystemController {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入IP : ");
String ip = scanner.nextLine();
System.out.println("正在加载请稍后……");
long startTime = System.currentTimeMillis();
String location=DataProcessManager.getLocation(ip);
if(location=="IP地址格式不正确,请重新输入"){
System.out.println(location);
continue;
}
long endTime = System.currentTimeMillis();
System.out.println("地址为:"+location);
System.out.println("运行时间: " + (endTime - startTime));
System.out.println("请问是否需要结束查询 1、 继续 2、结束 ");
String canshu=scanner.nextLine();
if(canshu.equals("1")){
continue;
}else if(canshu.equals("2")){
break;
}
}
}
}
package practice03.manager;
import practice03.util.DBUtil;
import practice03.pojo.IPAndLocationPojo;
import practice03.util.FileOperatorUtil;
import practice03.util.IPUtil;
import practice03.util.RegexUtil;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 该类为项目中管理类
*
*/
public class DataProcessManager {
private static IPAndLocationPojo[] ipLocationPojoArr = null;
static {
// 地址库文件
String ipLibrartPath = "ip_location_relation.txt";
// 字符编码
String encoding = "utf-8";
// 获取数据
List<IPAndLocationPojo> ipAndLocationPojos = null;
try {
ipAndLocationPojos = DataProcessManager.getPojoList(ipLibrartPath,
encoding);
} catch (IOException e) {
e.printStackTrace();
}
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs=null;
String sql="insert into ip(startIp,endIp,location) values (?,?,?)";
String sql02="select count(*) from ip";
try {
conn = DBUtil.getConnection();
stmt=conn.prepareStatement(sql02);
rs=stmt.executeQuery();
int count=0;
while(rs.next()){
count=rs.getInt("count(*)");
}
if(count==0){
stmt=conn.prepareStatement(sql);
System.out.println("正在将数据写入数据库中,请稍后");
for (IPAndLocationPojo ipAndLocationPojo : ipAndLocationPojos) {
stmt.setLong(1, ipAndLocationPojo.getStartIPLong());
stmt.setLong(2, ipAndLocationPojo.getEndIPLong());
stmt.setString(3, ipAndLocationPojo.getLocation());
stmt.executeUpdate();
}
System.out.println("数据库写入完成");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.close(stmt);
DBUtil.close(conn);
}
}
/**
* 对外提供的接口,入参IP出参地址
*
* @param ip
* @return
*/
public static String getLocation(String ip) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String canshu=null;
if(!RegexUtil.isValidIP(ip)){
return "IP地址格式不正确,请重新输入";
}else{
long ip1=IPUtil.ipToLong(ip);
String sql="select location from ip where startIp<"+ip1 +" and endIp >"+ip1+";";
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
rs=stmt.executeQuery(sql);
while(rs.next()){
canshu=rs.getString("location");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.close(rs);
DBUtil.close(stmt);
DBUtil.close(conn);
}
return canshu ;
}
}
/**
* 把读取到的List<String> 转换为 List<IPAndLocationPojo>
*
* @param ipLibrartPath
* @param encoding
* @return
* @throws IOException
*/
public static List<IPAndLocationPojo> getPojoList(String ipLibrartPath,
String encoding) throws IOException {
List<String> lineList = FileOperatorUtil.getLineList(ipLibrartPath,
encoding);
List<IPAndLocationPojo> ipAndLocationPojos = new ArrayList<IPAndLocationPojo>();
// 遍历 获取每一行
for (String string : lineList) {
if (string == null || string.trim().equals("")) {
continue;
}
// 以\t分割,得到三个列
String[] columnArray = string.split("\t");
// 创建结构化对象
IPAndLocationPojo ipAndLocationPojo = new IPAndLocationPojo(
columnArray[0], columnArray[1], columnArray[2]);
// 保存到集合中
ipAndLocationPojos.add(ipAndLocationPojo);
}
return ipAndLocationPojos;
}
}
package study.IPSearch_v2.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式工具类
*
*/
public class RegexUtil {
private static String regexIP = "((25[0-5]|2[0-4]\\d|[1]{1}\\d{1}\\d{1}|[1-9]{1}\\d{1}|\\d{1})($|(?!\\.$)\\.)){4}";
/**
* 校验IP
* @param ip
* @return
*/
public static boolean isValidIP(String ip) {
return isValid(regexIP, ip);
}
/**
* 格式验证
*
* @param regex
* @param input
* @return
*/
public static boolean isValid(String regex, String input) {
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
return matcher.matches();
}
/**
* 数据提取
*
* @param regex
* @param input
* @param groupIndex
* @return
*/
public static String getMatchContent(String regex, String input,
int groupIndex) {
Pattern pattern = Pattern.compile(regex);
// 创建匹配器
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
return matcher.group(groupIndex);
}
return null;
}
public static String getMatchContent(String regex, String input) {
return getMatchContent(regex, input, 0);
}
}