准备一个名为ip.txt的文件(如果你创建的文件名不一样,要修改相应代码),放在程序根目录下(如果你放的路径不一样也要修改相应代码),文件内容如下(每一行输入一个IP)
输入多个IP可以查多个
步骤:
getContentFromUrl();方法是获取IP138ip查询页面的内容(有兴趣的朋友可以改进这个函数直接从网页获取的内容截取出归属地。writeContentToFile();和getContentFromFile();方法可以不用)
writeContentToFile();方法作用是将从IP138ip查询页面获取的内容写到一个文件中去
getContentFromFile();方法作用是读取一个文件数据(这个例子就是读取上一个方法写入的文件)
getSpFromContent();方法是读取文本中的归属地(读取上个方法返回的字符串内容,截取出归属地)
getIpSp();方法整合上面的方法,传入一个存放有IP的文件地址,读取IP的归属地
方法写的有点复杂,有兴趣的朋友认真看注释还是可以看懂的
源代码:
package test1;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
public class IpQuery {
/**
* 从网页上获取数据
* @param wUrl URL地址
* @param charset 字符集
* @return 网页上的数据,string类型
*/
public static String getContentFromUrl(String ip,String charset) {
StringBuffer stringBuffer = new StringBuffer();
try {
//传入一个ip
URL url= new URL("http://www.ip138.com/ips138.asp?ip="+ip+"&action=2");
//(获取这个url的InputStream,创建一个scanner接收)从这个ip的查询返回页面抓取数据,charset指定页面编码格式
Scanner scanner = new Scanner(url.openStream(),charset);
//将从url获取的内容存到一个StringBuffer里
while(scanner.hasNextLine()){
stringBuffer.append(scanner.nextLine()+"\r\n");
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//返回这个stringBuffer的toString()方法
return stringBuffer.toString();
}
/**
* 功能:保存数据到文件中
* @param fileName 目标文件名(自定义路径)
* @param content 要保存的内容(取从网上获取数据函数的返回值)
* @return
*/
public static boolean writeContentToFile(String fileName,String content) {
try {
//把content内容写到名字为fileName的文件中(如a.txt)
PrintWriter printWriter = new PrintWriter(fileName);
printWriter.append(content);//添加content内容
printWriter.flush();
printWriter.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
}
}
/**
* 从文件读取数据
* @param fileName 文件名(路径)
* @return 文件的文本内容
*/
public static String getContentFromFile(String fileName) {
StringBuffer content = new StringBuffer();
Scanner scanner;
try {
//获取文件名为fileName的输入流
scanner = new Scanner(new FileInputStream(fileName));
while(scanner.hasNextLine()){
//用一个StringBuffer类型 接收每一行返回的字符串
content.append(scanner.nextLine()).append("\r\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return content.toString();
}
/**
* 从文本归属地和获取运营商
* @param content
* @return 归属地和运营商名称
*/
public static String getSpFromContent(String content) {
int beginIndex = content.indexOf("数据:");
int endIndex = content.indexOf("</li>");
//截取getContentFromFile()方法返回的字符串,从"数据:"截取到"</li>"
String sp = content.substring(beginIndex+3, endIndex);
return sp;
}
/**
* 获取IP的归属地(将前面的方法整合)
* @param fileName 存储IP的txt文件的文件路径
* @return 归属地
*/
@SuppressWarnings("resource")
public static String getIpSp(String fileName) {
String content1="";
String content2="";
Scanner scanner;
try {
//获取文档的内容
scanner = new Scanner(new FileInputStream(fileName));
while(scanner.hasNextLine()){
//将文档中每一行的IP传到getContentFromUrl()方法中
String content = getContentFromUrl(scanner.nextLine(), "gb2312");
//将getContentFromUrl()方法返回的字符串写到一个名字为d.html的文件中
writeContentToFile("d.html",content);
//再从名字为d.html的文件中获取所有的内容
content1 = getContentFromFile("d.html");
//把从名字为d.html的文件中获取所有的内容放到获取归属地的方法中(getSpFromContent()方法)
content2+=getSpFromContent(content1)+"\r\n";
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return "-1";
}
return content2;
}
public static void main(String[] args) {
//输入要查询的保存有ip的文档
System.out.println(getIpSp("ip.txt"));
}
}
writeContentToFile();方法作用是将从IP138ip查询页面获取的内容写到一个文件中去