Java編寫ip代理池(一)

各位盟友,第一次在github上發(fā)布源碼控妻,不足之處還往多多指教迂烁。

? ? ?這是給朋友爬蟲使用的ip代理池看尼,保證ip的有效性和可靠性,使用java實(shí)現(xiàn)盟步。

? ? ? 話不多說開始上干貨

? ? ?本次采用的是apache開源對(duì)象池PoolableObjectFactory管理所有ip

? ? 首先引項(xiàng)目所需依賴

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

? ? ? ? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

? ? <modelVersion>4.0.0</modelVersion>

? ? <parent>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-starter-parent</artifactId>

? ? ? ? <version>2.1.3.RELEASE</version>

? ? ? ? <relativePath/> <!-- lookup parent from repository -->

? ? </parent>

? ? <groupId>com.shimmer</groupId>

? ? <artifactId>iphttps</artifactId>

? ? <version>0.0.1-SNAPSHOT</version>

? ? <name>iphttps</name>

? ? <description>Demo project for Spring Boot</description>

? ? <properties>

? ? ? ? <java.version>1.8</java.version>

? ? </properties>

? ? <dependencies>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter-web</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter-test</artifactId>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.commons</groupId>

? ? ? ? ? ? <artifactId>commons-lang3</artifactId>

? ? ? ? ? ? <version>3.7</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>commons-codec</groupId>

? ? ? ? ? ? <artifactId>commons-codec</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>commons-httpclient</groupId>

? ? ? ? ? ? <artifactId>commons-httpclient</artifactId>

? ? ? ? ? ? <version>3.1</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.poi</groupId>

? ? ? ? ? ? <artifactId>poi</artifactId>

? ? ? ? ? ? <version>3.9</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.poi</groupId>

? ? ? ? ? ? <artifactId>poi-ooxml</artifactId>

? ? ? ? ? ? <version>3.9</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.alibaba</groupId>

? ? ? ? ? ? <artifactId>fastjson</artifactId>

? ? ? ? ? ? <version>1.2.47</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>commons-pool</groupId>

? ? ? ? ? ? <artifactId>commons-pool</artifactId>

? ? ? ? ? ? <version>1.6</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.httpcomponents</groupId>

? ? ? ? ? ? <artifactId>httpclient</artifactId>

? ? ? ? ? ? <version>4.5.2</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter-test</artifactId>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.junit.jupiter</groupId>

? ? ? ? ? ? <artifactId>junit-jupiter-api</artifactId>

? ? ? ? ? ? <version>RELEASE</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-test</artifactId>

? ? ? ? ? ? <version>2.1.3.RELEASE</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>junit</groupId>

? ? ? ? ? ? <artifactId>junit</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework</groupId>

? ? ? ? ? ? <artifactId>spring-test</artifactId>

? ? ? ? ? ? <version>5.1.5.RELEASE</version>

? ? ? ? </dependency>

? ? </dependencies>

? ? <build>

? ? ? ? <plugins>

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>

? ? ? ? ? ? </plugin>

? ? ? ? </plugins>

? ? </build>

</project>

核心配置文件application.yml

# PROXY代理配置

ip-proxy:

? # 最大活動(dòng)數(shù)

? maxActive: 200

? # 最大空閑數(shù)

? maxIdle: 20

? # 最大等待時(shí)間

? maxWait: 100

? #返回是否校驗(yàn)

? testOnReturn: false

? #借出是否校驗(yàn)

? testOnBorrow: true

? #是否后進(jìn)先出

? lifo: false

? #提前多少分鐘銷毀對(duì)象

? testTime: 3

? #設(shè)定間隔每過多少毫秒進(jìn)行一次后臺(tái)對(duì)象清理的行動(dòng)藏斩。如果這個(gè)值不是正數(shù),則實(shí)際上不會(huì)進(jìn)行后臺(tái)對(duì)象清理却盘。

? timeBetweenEvictionRunsMillis: -1000

? #設(shè)定在進(jìn)行后臺(tái)對(duì)象清理時(shí)狰域,是否還對(duì)沒有過期的池內(nèi)對(duì)象進(jìn)行有效性檢查。不能通過有效性檢查的對(duì)象也將被回收黄橘。

? testWhileIdle: true

? #設(shè)定在進(jìn)行后臺(tái)對(duì)象清理時(shí)兆览,每次檢查幾個(gè)對(duì)象。如果這個(gè)值不是正數(shù)塞关,則每次檢查的對(duì)象數(shù)是檢查時(shí)池內(nèi)對(duì)象的總數(shù)乘以這個(gè)值的負(fù)倒數(shù)再向上取整的結(jié)果――也就是說抬探,

? #如果這個(gè)值是-2(-3、-4描孟、-5……)的話驶睦,那么每次大約檢查當(dāng)時(shí)池內(nèi)對(duì)象總數(shù)的1/2(1/3、1/4匿醒、1/5……)左右场航。

? numTestsPerEvictionRun: 3

? # 獲取ip 方式 0 為免費(fèi) 1 為付費(fèi) 2 為免費(fèi)和付費(fèi)同時(shí)進(jìn)行

? iPType: 2

? # IP代理請(qǐng)求路徑 某某第三方ip代理

? httpPath: "http://"

? # IP代理請(qǐng)求參數(shù)

? httpProxy:

? #所有的參數(shù)和對(duì)應(yīng)的值 如下:

? ? num: "1"

? ? type: "2"

? ? pro: ""

? ? city: ""

? ? yys: "0"

? ? port: "1"

? ? pack: "1111"

? ? amount: "1"

? ? ts: "1"

? ? ys: "1"

? ? cs: "1"

? ? lb: "1"

? ? sb: "0"

? ? pb: "4"

? ? mr: "1"

? ? regions: ""

獲取配置類?

package com.sunshine.http_proxy.utils;

import java.util.HashMap;

import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.Configuration;

/**

* @author xaingzi

* 配置類

* 從配置文件中讀取數(shù)據(jù)映射到map

* 注意:必須實(shí)現(xiàn)set方法

*/

@Configuration

@ConfigurationProperties(prefix = "ip-proxy")

public class HttpProxyConfig {

? private int maxActive;

? private int maxIdle;

? private int maxWait;

? private int testTime;

? private int numTestsPerEvictionRun;

? private int iPType;

? private boolean testOnReturn;

? private boolean testOnBorrow;

? private boolean lifo;

? private String httpPath;

? private boolean testWhileIdle;

? private long timeBetweenEvictionRunsMillis;

? private Map<String, String> httpProxy = new HashMap<>();


? public int getMaxActive() {

? ? ? return maxActive;

? }

? public void setMaxActive(int maxActive) {

? ? ? this.maxActive = maxActive;

? }

? public int getMaxIdle() {

? ? ? return maxIdle;

? }

? public void setMaxIdle(int maxIdle) {

? ? ? this.maxIdle = maxIdle;

? }

? public int getMaxWait() {

? ? ? return maxWait;

? }

? public void setMaxWait(int maxWait) {

? ? ? this.maxWait = maxWait;

? }

? public boolean isTestOnReturn() {

? ? ? return testOnReturn;

? }

? public void setTestOnReturn(boolean testOnReturn) {

? ? ? this.testOnReturn = testOnReturn;

? }

? public boolean isTestOnBorrow() {

? ? ? return testOnBorrow;

? }

? public void setTestOnBorrow(boolean testOnBorrow) {

? ? ? this.testOnBorrow = testOnBorrow;

? }

? public boolean isLifo() {

? ? ? return lifo;

? }

? public void setLifo(boolean lifo) {

? ? ? this.lifo = lifo;

? }

? public String getHttpPath() {

? ? ? return httpPath;

? }

? public void setHttpPath(String httpPath) {

? ? ? this.httpPath = httpPath;

? }

? public Map<String, String> getHttpProxy() {

? ? ? return httpProxy;

? }

? public void setHttpProxy(Map<String, String> httpProxy) {

? ? ? this.httpProxy = httpProxy;

? }

? public int getTestTime() {

? ? ? return testTime;

? }

? public void setTestTime(int testTime) {

? ? ? this.testTime = testTime;

? }

? public boolean isTestWhileIdle() {

? ? ? return testWhileIdle;

? }

? public void setTestWhileIdle(boolean testWhileIdle) {

? ? ? this.testWhileIdle = testWhileIdle;

? }

? public long getTimeBetweenEvictionRunsMillis() {

? ? ? return timeBetweenEvictionRunsMillis;

? }

? public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {

? ? ? this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;

? }

? ? public int getNumTestsPerEvictionRun() {

? ? ? ? return numTestsPerEvictionRun;

? ? }

? ? public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {

? ? ? ? this.numTestsPerEvictionRun = numTestsPerEvictionRun;

? ? }

? ? public int getiPType() {

? ? ? ? return iPType;

? ? }

? ? public void setiPType(int iPType) {

? ? ? ? this.iPType = iPType;

? ? }

}


ip對(duì)象存儲(chǔ)基類

package com.sunshine.http_proxy.pool;

/**

* 代理對(duì)象

*

* @author xaingzi

*/

import java.io.Serializable;

public class ProxyHost implements Serializable {

? ? /**

? ? * 序列化

? ? */

? ? private static final long serialVersionUID = 1L;

? ? private String ip;

? ? private Integer port;

? ? private String creaTime;

? ? private String expireTime;

? ? private String city;

? ? private String isp;

? ? public String getIp() {

? ? ? ? return ip;

? ? }

? ? public void setIp(String ip) {

? ? ? ? this.ip = ip;

? ? }

? ? public Integer getPort() {

? ? ? ? return port;

? ? }

? ? public void setPort(Integer port) {

? ? ? ? this.port = port;

? ? }

? ? public String getCreaTime() {

? ? ? ? return creaTime;

? ? }

? ? public void setCreaTime(String creaTime) {

? ? ? ? this.creaTime = creaTime;

? ? }

? ? public String getExpireTime() {

? ? ? ? return expireTime;

? ? }

? ? public void setExpireTime(String expireTime) {

? ? ? ? this.expireTime = expireTime;

? ? }

? ? public String getCity() {

? ? ? ? return city;

? ? }

? ? public void setCity(String city) {

? ? ? ? this.city = city;

? ? }

? ? public String getIsp() {

? ? ? ? return isp;

? ? }

? ? public void setIsp(String isp) {

? ? ? ? this.isp = isp;

? ? }

? ? @Override

? ? public String toString() {

? ? ? ? return "ip:" + ip + " 端口:" + port + "? 到期時(shí)間:" + expireTime + " 創(chuàng)建時(shí)間:" + creaTime + " 城市:" + city + " isp:" + isp;

? ? }

}

http請(qǐng)求獲取第三方代理ip和掃描免費(fèi)代理ip?

package com.sunshine.http_proxy;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.InetSocketAddress;

import java.net.MalformedURLException;

import java.net.Proxy;

import java.net.URL;

import java.net.URLConnection;

import java.text.SimpleDateFormat;

import java.util.*;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

import com.sunshine.http_proxy.utils.DateUtil;

import com.sunshine.http_proxy.utils.HttpClientUtil;

import com.sunshine.http_proxy.utils.HttpProxyConfig;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.lang3.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

/**

*

* @author xaingzi

*

*/

@SuppressWarnings({"unchecked", "rawtypes"})

public class HttpProxyClientLocat implements Runnable {

? ? public static Logger log = LoggerFactory.getLogger(HttpProxyClientLocat.class);

? ? private static final String BAIDU_PATH = "http://youxingyang.com";

? ? private static Map<String, String> hashMap = new Hashtable<String, String>();

? ? private static JSONObject json = new JSONObject();

? ? private static int[] ports = new int[]{80, 443, 8883, 4271, 8886, 8080, 8888, 8887, 8889, 8081};

? ? private static String expireTime, city, isp;

? ? private static int i = 0;

? ? /**

? ? * @param path

? ? * @param map

? ? * @return

? ? */

? ? public static JSONObject getHttpClientProxyIp(String path, Map<String, String> map) {

? ? ? ? List list = new ArrayList<HashMap<String, String>>();

? ? ? ? JSONObject json = new JSONObject();

? ? ? ? do {

? ? ? ? ? ? String result = HttpClientUtil.httpGet(path, map);

? ? ? ? ? ? log.info("獲取ip信息:" + result);

? ? ? ? ? ? List<String> parseArray = JSON.parseArray(JSON.parseObject(result).getString("data"), String.class);

? ? ? ? ? ? for (String str : parseArray) {

? ? ? ? ? ? ? ? String ip = JSON.parseObject(str).getString("ip");

? ? ? ? ? ? ? ? String port = JSON.parseObject(str).getString("http_port_secured");

? ? ? ? ? ? ? ? // String id =

? ? ? ? ? ? ? ? // JSON.parseObject(result).getJSONArray("data").getJSONObject(0).getString("id");

? ? ? ? ? ? ? ? Map<String, Integer> map1 = new HashMap<String, Integer>();

? ? ? ? ? ? ? ? map1.put(ip, Integer.valueOf(port));

? ? ? ? ? ? ? ? checkProxyIp(map1, BAIDU_PATH);

? ? ? ? ? ? }

? ? ? ? } while ((i < 3) && (hashMap.size() < 1));

? ? ? ? list.add(hashMap);

? ? ? ? json.put("status", 0);

? ? ? ? json.put("data", list);

? ? ? ? return json;

? ? }

? ? /**

? ? * @param httpProxyConfig

? ? * @return

? ? */

? ? public static JSONObject getHttpClientProxyIp(HttpProxyConfig httpProxyConfig) {

? ? ? ? hashMap.clear();

? ? ? ? JSONObject json = new JSONObject();

? ? ? ? if (httpProxyConfig.getiPType() == 0) {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? json = getHttpChilentProxyApi();

? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }

? ? ? ? } else if (httpProxyConfig.getiPType() == 1) {

? ? ? ? ? ? json = getHttpClient(httpProxyConfig);

? ? ? ? } else if (httpProxyConfig.getiPType() == 2) {

? ? ? ? ? ? if (Math.random() > 0.3) {

? ? ? ? ? ? ? ? json = getHttpClient(httpProxyConfig);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? json = getHttpChilentProxyApi();

? ? ? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return json;

? ? }

? ? private static JSONObject getHttpClient(HttpProxyConfig httpProxyConfig) {

? ? ? ? List list = new ArrayList<HashMap<String, String>>();

? ? ? ? do {

? ? ? ? ? ? log.info("發(fā)送Get請(qǐng)求:" + httpProxyConfig.getHttpPath());

? ? ? ? ? ? String result = HttpClientUtil.httpGet(httpProxyConfig.getHttpPath(), httpProxyConfig.getHttpProxy());

? ? ? ? ? ? log.info("獲取ip信息:" + result);

? ? ? ? ? ? List<String> parseArray = JSON.parseArray(JSON.parseObject(result).getString("data"), String.class);

? ? ? ? ? ? for (String str : parseArray) {

? ? ? ? ? ? ? ? String ip = JSON.parseObject(str).getString("ip");

? ? ? ? ? ? ? ? String port = JSON.parseObject(str).getString("port");

? ? ? ? ? ? ? ? expireTime = JSON.parseObject(str).getString("expire_time");

? ? ? ? ? ? ? ? isp = city = JSON.parseObject(str).getString("isp");

? ? ? ? ? ? ? ? city = JSON.parseObject(str).getString("city");

? ? ? ? ? ? ? ? // String id =

? ? ? ? ? ? ? ? // JSON.parseObject(result).getJSONArray("data").getJSONObject(0).getString("id");

? ? ? ? ? ? ? ? Map<String, Integer> map1 = new HashMap<String, Integer>();

? ? ? ? ? ? ? ? map1.put(ip, Integer.valueOf(port));

? ? ? ? ? ? ? ? checkProxyIp(map1, BAIDU_PATH);

? ? ? ? ? ? }

? ? ? ? } while ((i < 3) && (hashMap.size() < 1));

? ? ? ? list.add(hashMap);

? ? ? ? json.put("status", 0);

? ? ? ? json.put("data", list);

? ? ? ? return json;

? ? }

? ? /**

? ? * 單個(gè)代理IP有效檢測(cè)

? ? *

? ? * @param ip

? ? * @param port

? ? */

? ? public void createIPAddress(String ip, int port) {

? ? ? ? URL url = null;

? ? ? ? try {

? ? ? ? ? ? url = new URL("http://www.baidu.com");

? ? ? ? } catch (MalformedURLException e) {

? ? ? ? ? ? log.info("url invalidate");

? ? ? ? }

? ? ? ? InetSocketAddress addr = null;

? ? ? ? addr = new InetSocketAddress(ip, port);

? ? ? ? Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http proxy

? ? ? ? InputStream in = null;

? ? ? ? try {

? ? ? ? ? ? URLConnection conn = url.openConnection(proxy);

? ? ? ? ? ? conn.setConnectTimeout(1000);

? ? ? ? ? ? in = conn.getInputStream();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? log.info(Thread.currentThread().getName() + "? ip " + ip + " : " + port + "? is not aviable");// 異常IP

? ? ? ? }

? ? ? ? String s = convertStreamToString(in);

? ? ? ? //log.info(s);

? ? ? ? // log.info(s);http://ip.taobao.com/service/getIpInfo.php?ip=210.32.158.14

? ? ? ? ? ? synchronized (this){

? ? ? ? ? ? ? ? if (s.indexOf("html") > 0) {// 有效IP

? ? ? ? ? ? ? ? ? ? ? ? log.info(Thread.currentThread().getName() + "? " + ip + ":" + port + " is ok");

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("ip", ip);

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("port", port + "");

? ? ? ? ? ? ? ? ? ? ? ? String s1 = HttpClientUtil.getResult("http://ip.taobao.com/service/getIpInfo.php", "ip=" + ip, "utf-8");

? ? ? ? ? ? ? ? ? ? ? ? //String[] split = JSON.parseObject(s1).getJSONArray("data").getJSONObject(0).getString("location")

? ? ? ? ? ? ? ? ? ? ? ? //.split(" ");

? ? ? ? ? ? ? ? ? ? ? ? JSONObject data = JSON.parseObject(JSON.parseObject(s1).getString("data"));

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("ip", ip);

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("port", port + "");

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("creaTime", (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()));

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("expireTime", DateUtil.format(DateUtil.addMinute(new Date(), 30), DateUtil.TIME_PATTERN_DEFAULT));

? ? ? ? ? ? ? ? ? ? ? ? if (StringUtils.equals(data.getString("region"), data.getString("city"))) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("city", data.getString("region") + "市" + data.getString("city") + "市");

? ? ? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("city", data.getString("region") + "省" + data.getString("city") + "市");

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? hashMap.put("isp", data.getString("isp"));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? }

? ? public static JSONObject getHttpChilentProxyApi() throws InterruptedException {

? ? ? ? Vector vector = new Vector();

? ? ? ? log.info("獲取免費(fèi)ip");

? ? ? ? Vector<Thread> vec = new Vector<Thread>();

? ? ? ? HttpProxyClientLocat httptest2 = new HttpProxyClientLocat();

? ? ? ? int threadNumber = 320;

? ? ? ? for (int i = 0; i < threadNumber; i++) {

? ? ? ? ? ? Thread thread = new Thread(httptest2);

? ? ? ? ? ? thread.start();

? ? ? ? ? ? vec.add(thread);

? ? ? ? }

? ? ? ? for (Thread thread : vec) {

? ? ? ? ? ? thread.join();

? ? ? ? }

? ? ? ? vector.add(hashMap);

? ? ? ? json.put("status", 0);

? ? ? ? json.put("data", vector);

? ? ? ? log.info(json.toString());

? ? ? ? return json;

? ? }

? ? @Override

? ? public void run() {

? ? ? ? while (hashMap.size() < 1) {

? ? ? ? ? ? String randomIp = getRandomIp();

? ? ? ? ? ? log.info(randomIp);

? ? ? ? ? ? for (int port : ports) {

? ? ? ? ? ? ? ? createIPAddress(randomIp, port);

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? public static String convertStreamToString(InputStream is) {

? ? ? ? if (is == null)

? ? ? ? ? ? return "";

? ? ? ? BufferedReader reader = new BufferedReader(new InputStreamReader(is));

? ? ? ? StringBuilder sb = new StringBuilder();

? ? ? ? String line = null;

? ? ? ? try {

? ? ? ? ? ? while ((line = reader.readLine()) != null) {

? ? ? ? ? ? ? ? sb.append(line + "/n");

? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? is.close();

? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return sb.toString();

? ? }

? ? /**

? ? * 批量代理IP有效檢測(cè)

? ? *

? ? * @param proxyIpMap

? ? * @param reqUrl

? ? */

? ? public static void checkProxyIp(Map<String, Integer> proxyIpMap, String reqUrl) {

? ? ? ? log.info("檢測(cè)ip是否有效");

? ? ? ? for (String proxyHost : proxyIpMap.keySet()) {

? ? ? ? ? ? Integer proxyPort = proxyIpMap.get(proxyHost);

? ? ? ? ? ? int statusCode = 0;

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? HttpClient httpClient = new HttpClient();

? ? ? ? ? ? ? ? httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);

? ? ? ? ? ? ? ? // 連接超時(shí)時(shí)間(默認(rèn)10秒 10000ms) 單位毫秒(ms)

? ? ? ? ? ? ? ? int connectionTimeout = 10000;

? ? ? ? ? ? ? ? // 讀取數(shù)據(jù)超時(shí)時(shí)間(默認(rèn)30秒 30000ms) 單位毫秒(ms)

? ? ? ? ? ? ? ? int soTimeout = 30000;

? ? ? ? ? ? ? ? httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);

? ? ? ? ? ? ? ? httpClient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);

? ? ? ? ? ? ? ? String httpGet = HttpClientUtil.httpGet(reqUrl, new HashMap<>());

? ? ? ? ? ? ? ? log.info(httpGet);

? ? ? ? ? ? ? ? statusCode = httpGet.indexOf("html");

? ? ? ? ? ? } catch (Exception e) {

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? ? ? log.error("ip " + proxyHost + " is not aviable");

? ? ? ? ? ? }

? ? ? ? ? ? Lock l = new ReentrantLock();

? ? ? ? ? ? l.lock();

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? if (statusCode > 0) {

? ? ? ? ? ? ? ? ? ? log.info(Thread.currentThread().getName() + "? " + proxyHost + ":" + proxyPort + " is ok");

? ? ? ? ? ? ? ? ? ? System.out.format("%s:%s-->%s/n", proxyHost, proxyPort, statusCode);

? ? ? ? ? ? ? ? ? ? hashMap.put("creaTime", (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()));

? ? ? ? ? ? ? ? ? ? hashMap.put("expireTime", expireTime);

? ? ? ? ? ? ? ? ? ? hashMap.put("city", city);

? ? ? ? ? ? ? ? ? ? hashMap.put("ip", proxyHost);

? ? ? ? ? ? ? ? ? ? hashMap.put("port", proxyPort + "");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } finally {

? ? ? ? ? ? ? ? l.unlock();

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? public static JSONObject connectHttpChilentStatus(String http) {

? ? ? ? List list = new ArrayList<HashMap<String, String>>();

? ? ? ? log.info("開始校驗(yàn)" + http);

? ? ? ? JSONObject json = new JSONObject();

? ? ? ? if (null != http && "" != http) {

? ? ? ? ? ? String[] ips = http.split(",");

? ? ? ? ? ? for (String ip : ips) {

? ? ? ? ? ? ? ? if (null != ip && "" != ip) {

? ? ? ? ? ? ? ? ? ? Map<String, Object> map = new HashMap<>();

? ? ? ? ? ? ? ? ? ? String[] str = ip.split(":");

? ? ? ? ? ? ? ? ? ? int statusCode = 0;

? ? ? ? ? ? ? ? ? ? map.put("ip", str[0]);

? ? ? ? ? ? ? ? ? ? map.put("port", str[1]);

? ? ? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? ? ? HttpClient httpClient = new HttpClient();

? ? ? ? ? ? ? ? ? ? ? ? httpClient.getHostConfiguration().setProxy(str[0], Integer.valueOf(str[1]));

? ? ? ? ? ? ? ? ? ? ? ? // 連接超時(shí)時(shí)間(默認(rèn)10秒 10000ms) 單位毫秒(ms)

? ? ? ? ? ? ? ? ? ? ? ? int connectionTimeout = 10000;

? ? ? ? ? ? ? ? ? ? ? ? // 讀取數(shù)據(jù)超時(shí)時(shí)間(默認(rèn)30秒 30000ms) 單位毫秒(ms)

? ? ? ? ? ? ? ? ? ? ? ? int soTimeout = 30000;

? ? ? ? ? ? ? ? ? ? ? ? httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);

? ? ? ? ? ? ? ? ? ? ? ? httpClient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);

? ? ? ? ? ? ? ? ? ? ? ? String httpGet = HttpClientUtil.httpGet(BAIDU_PATH, new HashMap<>());

? ? ? ? ? ? ? ? ? ? ? ? log.info(httpGet);

? ? ? ? ? ? ? ? ? ? ? ? statusCode = httpGet.indexOf("html");

? ? ? ? ? ? ? ? ? ? } catch (Exception e) {

? ? ? ? ? ? ? ? ? ? ? ? map.put("status", 500);

? ? ? ? ? ? ? ? ? ? ? ? map.put("msg", "連接超時(shí)");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if (statusCode > 0) {

? ? ? ? ? ? ? ? ? ? ? ? map.put("status", 0);

? ? ? ? ? ? ? ? ? ? ? ? map.put("msg", "連接成功");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? list.add(map);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? json.put("status", 0);

? ? ? ? json.put("data", list);

? ? ? ? return json;

? ? }

? ? public static String getRandomIp() {

? ? ? ? // ip范圍

? ? ? ? int[][] range = {{607649792, 608174079}, // 36.56.0.0-36.63.255.255

? ? ? ? ? ? ? ? {1038614528, 1039007743}, // 61.232.0.0-61.237.255.255

? ? ? ? ? ? ? ? {1783627776, 1784676351}, // 106.80.0.0-106.95.255.255

? ? ? ? ? ? ? ? {2035023872, 2035154943}, // 121.76.0.0-121.77.255.255

? ? ? ? ? ? ? ? {2078801920, 2079064063}, // 123.232.0.0-123.235.255.255

? ? ? ? ? ? ? ? {-1950089216, -1948778497}, // 139.196.0.0-139.215.255.255

? ? ? ? ? ? ? ? {-1425539072, -1425014785}, // 171.8.0.0-171.15.255.255

? ? ? ? ? ? ? ? {-1236271104, -1235419137}, // 182.80.0.0-182.92.255.255

? ? ? ? ? ? ? ? {-770113536, -768606209}, // 210.25.0.0-210.47.255.255

? ? ? ? ? ? ? ? {-569376768, -564133889}, // 222.16.0.0-222.95.255.255

? ? ? ? };

? ? ? ? Random rdint = new Random();

? ? ? ? int index = rdint.nextInt(10);

? ? ? ? String ip = num2ip(range[index][0] + new Random().nextInt(range[index][1] - range[index][0]));

? ? ? ? return ip;

? ? }

? ? public static String num2ip(int ip) {

? ? ? ? int[] b = new int[4];

? ? ? ? String x = "";

? ? ? ? b[0] = (int) ((ip >> 24) & 0xff);

? ? ? ? b[1] = (int) ((ip >> 16) & 0xff);

? ? ? ? b[2] = (int) ((ip >> 8) & 0xff);

? ? ? ? b[3] = (int) (ip & 0xff);

? ? ? ? x = Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2]) + "."

? ? ? ? ? ? ? ? + Integer.toString(b[3]);

? ? ? ? return x;

? ? }

}

因?yàn)橛玫搅藭r(shí)間轉(zhuǎn)換和?httpClient請(qǐng)求? 所以我也把這兩個(gè)工具類貼出來?方便使用

httpClientUtil

package com.sunshine.http_proxy.utils;

import java.io.*;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpEntity;

import org.apache.http.NameValuePair;

import org.apache.http.client.config.CookieSpecs;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

public class HttpClientUtil {

? ? public static String httpGet(String url, Map<String, String> params) {

? ? ? ? CloseableHttpClient httpClient = HttpClients.createDefault();

? ? ? ? Iterator<String> keysIte = params.keySet().iterator();

? ? ? ? int index = 0;

? ? ? ? while (keysIte.hasNext()) {

? ? ? ? ? ? String key = keysIte.next();

? ? ? ? ? ? if (index == 0) {

? ? ? ? ? ? ? ? url = url + "?" + key + "=" + params.get(key);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? url = url + "&" + key + "=" + params.get(key);

? ? ? ? ? ? }

? ? ? ? ? ? index++;

? ? ? ? }

? ? ? ? HttpGet httpget = new HttpGet(url);

? ? ? ? CloseableHttpResponse response = null;

? ? ? ? StringBuilder result = new StringBuilder();

? ? ? ? // 設(shè)置請(qǐng)求和傳輸超時(shí)時(shí)間5s,設(shè)置cookie策略

? ? ? ? RequestConfig requestconfig = RequestConfig.custom()

? ? ? ? ? ? ? ? .setSocketTimeout(5000).setConnectTimeout(5000)

? ? ? ? ? ? ? ? .setCookieSpec(CookieSpecs.BEST_MATCH).build();

? ? ? ? httpget.setConfig(requestconfig);

? ? ? ? try {

? ? ? ? ? ? response = httpClient.execute(httpget);

? ? ? ? ? ? HttpEntity entity = response != null ? response.getEntity() : null;

? ? ? ? ? ? if (entity != null) {

? ? ? ? ? ? ? ? InputStream in = entity.getContent();

? ? ? ? ? ? ? ? BufferedReader br = new BufferedReader(new InputStreamReader(

? ? ? ? ? ? ? ? ? ? ? ? in, "UTF-8"));

? ? ? ? ? ? ? ? String line;

? ? ? ? ? ? ? ? while ((line = br.readLine()) != null) {

? ? ? ? ? ? ? ? ? ? result.append(line);

? ? ? ? ? ? ? ? ? ? result.append("\n");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? in.close();

? ? ? ? ? ? ? ? br.close();

? ? ? ? ? ? }

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? if (response != null) response.close();

? ? ? ? ? ? ? ? httpClient.close();

? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return result.toString();

? ? }

? ? public static String httpPost(String url, String body) {

? ? ? ? CloseableHttpClient httpClient = HttpClients.createDefault();

? ? ? ? HttpPost httpPost = new HttpPost(url);

? ? ? ? CloseableHttpResponse response = null;

? ? ? ? String result = null;

? ? ? ? try {

? ? ? ? ? ? StringEntity stringEntity = new StringEntity(body, "UTF-8");

? ? ? ? ? ? httpPost.setEntity(stringEntity);

? ? ? ? ? ? response = httpClient.execute(httpPost);

? ? ? ? ? ? HttpEntity entity = response != null ? response.getEntity() : null;

? ? ? ? ? ? if (entity != null) {

? ? ? ? ? ? ? ? result = EntityUtils.toString(entity, "UTF-8");

? ? ? ? ? ? }

? ? ? ? ? ? EntityUtils.consume(entity);

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? if (response != null) response.close();

? ? ? ? ? ? ? ? httpClient.close();

? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return result;

? ? }

? ? public static String httpPost(String url, Map<String, String> params) {

? ? ? ? CloseableHttpClient httpClient = HttpClients.createDefault();

? ? ? ? HttpPost httpPost = new HttpPost(url);

? ? ? ? CloseableHttpResponse response = null;

? ? ? ? String result = null;

? ? ? ? try {

? ? ? ? ? ? List<NameValuePair> nvps = new ArrayList<NameValuePair>();

? ? ? ? ? ? for (String key : params.keySet()) {

? ? ? ? ? ? ? ? nvps.add(new BasicNameValuePair(key, params.get(key)));

? ? ? ? ? ? }

? ? ? ? ? ? httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));

? ? ? ? ? ? response = httpClient.execute(httpPost);

? ? ? ? ? ? HttpEntity entity = response != null ? response.getEntity() : null;

? ? ? ? ? ? if (entity != null) {

? ? ? ? ? ? ? ? result = EntityUtils.toString(entity, "UTF-8");

? ? ? ? ? ? }

? ? ? ? ? ? EntityUtils.consume(entity);

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? if (response != null) response.close();

? ? ? ? ? ? ? ? httpClient.close();

? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return result;

? ? }

? ? public static String getBodyString(BufferedReader br) {

? ? ? ? String inputLine;

? ? ? ? String str = "";

? ? ? ? try {

? ? ? ? ? ? while ((inputLine = br.readLine()) != null) {

? ? ? ? ? ? ? ? str += inputLine;

? ? ? ? ? ? }

? ? ? ? ? ? br.close();

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? System.out.println("IOException: " + e);

? ? ? ? }

? ? ? ? return str;

? ? }

? ? /**

? ? * 設(shè)置url以及鍵值對(duì)參數(shù)

? ? *

? ? * @param url

? ? * @param params

? ? * @return

? ? */

? ? public static String getUrlWithParams(String url, Map<String, String> params) {

? ? ? ? Iterator<String> keysIte = params.keySet().iterator();

? ? ? ? int index = 0;

? ? ? ? while (keysIte.hasNext()) {

? ? ? ? ? ? String key = keysIte.next();

? ? ? ? ? ? if (index == 0) {

? ? ? ? ? ? ? ? url = url + "?" + key + "=" + params.get(key);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? url = url + "&" + key + "=" + params.get(key);

? ? ? ? ? ? }

? ? ? ? ? ? index++;

? ? ? ? }

? ? ? ? return url;

? ? }

? ? /**

? ? * 按照一定順序設(shè)置url以及鍵值對(duì)參數(shù)

? ? *

? ? * @param url

? ? * @param params

? ? * @param orderList

? ? * @return

? ? */

? ? public static String getUrlWithParams(String url, Map<String, String> params, List<String> orderList) {

? ? ? ? int index = 0;

? ? ? ? for (String key : orderList) {

? ? ? ? ? ? if (index == 0) {

? ? ? ? ? ? ? ? url = url + "?" + key + "=" + params.get(key);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? url = url + "&" + key + "=" + params.get(key);

? ? ? ? ? ? }

? ? ? ? ? ? index++;

? ? ? ? }

? ? ? ? return url;

? ? }

? ? /**

? ? * @param urlStr? 請(qǐng)求的地址

? ? * @param content? 請(qǐng)求的參數(shù) 格式為:name=xxx&pwd=xxx

? ? * @param encoding 服務(wù)器端請(qǐng)求編碼。如GBK,UTF-8等

? ? * @return

? ? */

? ? public static String getResult(String urlStr, String content, String encoding) {

? ? ? ? URL url = null;

? ? ? ? HttpURLConnection connection = null;

? ? ? ? try {

? ? ? ? ? ? url = new URL(urlStr);

? ? ? ? ? ? connection = (HttpURLConnection) url.openConnection();// 新建連接實(shí)例

? ? ? ? ? ? connection.setConnectTimeout(2000);// 設(shè)置連接超時(shí)時(shí)間廉羔,單位毫秒

? ? ? ? ? ? connection.setReadTimeout(2000);// 設(shè)置讀取數(shù)據(jù)超時(shí)時(shí)間溉痢,單位毫秒

? ? ? ? ? ? connection.setDoOutput(true);// 是否打開輸出流 true|false

? ? ? ? ? ? connection.setDoInput(true);// 是否打開輸入流true|false

? ? ? ? ? ? connection.setRequestMethod("GET");// 提交方法POST|GET

? ? ? ? ? ? connection.setUseCaches(false);// 是否緩存true|false

? ? ? ? ? ? connection.connect();// 打開連接端口

? ? ? ? ? ? DataOutputStream out = new DataOutputStream(connection

? ? ? ? ? ? ? ? ? ? .getOutputStream());// 打開輸出流往對(duì)端服務(wù)器寫數(shù)據(jù)

? ? ? ? ? ? out.writeBytes(content);// 寫數(shù)據(jù),也就是提交你的表單 name=xxx&pwd=xxx

? ? ? ? ? ? out.flush();// 刷新

? ? ? ? ? ? out.close();// 關(guān)閉輸出流

? ? ? ? ? ? BufferedReader reader = new BufferedReader(new InputStreamReader(

? ? ? ? ? ? ? ? ? ? connection.getInputStream(), encoding));// 往對(duì)端寫完數(shù)據(jù)對(duì)端服務(wù)器返回?cái)?shù)據(jù)

? ? ? ? ? ? // ,以BufferedReader流來讀取

? ? ? ? ? ? StringBuffer buffer = new StringBuffer();

? ? ? ? ? ? String line = "";

? ? ? ? ? ? while ((line = reader.readLine()) != null) {

? ? ? ? ? ? ? ? buffer.append(line);

? ? ? ? ? ? }

? ? ? ? ? ? reader.close();

? ? ? ? ? ? return buffer.toString();

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? if (connection != null) {

? ? ? ? ? ? ? ? connection.disconnect();// 關(guān)閉連接

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return null;

? ? }

}

DateUtil

/**

?* 時(shí)間操作工具

?*

* @author xaingzi

*

*/

package com.sunshine.http_proxy.utils;

import org.apache.commons.lang3.StringUtils;

import javax.xml.datatype.DatatypeConfigurationException;

import javax.xml.datatype.DatatypeFactory;

import javax.xml.datatype.XMLGregorianCalendar;

import java.sql.Timestamp;

import java.text.DateFormatSymbols;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.*;

/**

* 日期轉(zhuǎn)換工具

*/

public class DateUtil {

? public static final String DATE_DIVISION = "-";

? /**

? ? * yyyy-MM-dd HH:mm:ss

? ? */

? public static final String TIME_PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss";

? public static final String TIME_PATTERN_DEFAULT_NO_SS = "yyyy-MM-dd HH:mm";

? /**

? ? * yyyy-MM-dd

? ? */

? public static final String DATE_PATTERN_DEFAULT = "yyyy-MM-dd";

? /**

? ? * yyyyMMdd

? ? */

? public static final String DATA_PATTERN_YYYYMMDD = "yyyyMMdd";

? /**

? ? * HH:mm:ss

? ? */

? public static final String TIME_PATTERN_HHMMSS = "HH:mm:ss";

? /**

? ? * yyyy-MM-dd HH-mm-ss

? ? */

? public static final String TIME_PATTERN = "yyyy-MM-dd HH-mm-ss";

? /**

? ? * yyyyMMddHHmmss

? ? */

? public static final String TIME_PATTERN_DEFAULT_STR = "yyyyMMddHHmmss";

? public static final String TIME_PATTERN_SSSS_STR = "yyyyMMddHHmmssSSSS";

? public static final int SECOND = 1000;

? public static final int MINUTE = 60 * SECOND;

? public static final int HOUR = 60 * MINUTE;

? public static final long DAY = 24l * HOUR;

? /**

? ? * Return the current date

? ? *

? ? * @return - DATE<br>

? ? */

? public static Date now() {

? ? ? Calendar cal = Calendar.getInstance();

? ? ? Date currDate = cal.getTime();

? ? ? return currDate;

? }

? public static Timestamp nowTimestamp() {

? ? ? Calendar cal = Calendar.getInstance();

? ? ? return new Timestamp(cal.getTimeInMillis());

? }

? /**

? ? * 給一個(gè)時(shí)間加上N分種或減去N分種后得到一個(gè)新的日期

? ? *

? ? * @param startDate

? ? *? ? ? ? ? ? 需要增加的日期時(shí)間

? ? * @param addnos

? ? *? ? ? ? ? ? 添加的分鐘數(shù),可以是正數(shù)也可以是負(fù)數(shù)

? ? * @return 操作后的日期

? ? */

? public static Date addMinute(Date startDate, int addnos) {

? ? ? if (startDate == null) {

? ? ? ? return null;

? ? ? }

? ? ? Calendar cc = Calendar.getInstance();

? ? ? cc.setTime(startDate);

? ? ? cc.add(Calendar.MINUTE, addnos);

? ? ? return cc.getTime();

? }

? /**

? ? * Return the current date string

? ? *

? ? * @return - 產(chǎn)生的日期字符串<br>

? ? */

? public static String nowString() {

? ? ? Calendar cal = Calendar.getInstance();

? ? ? Date currDate = cal.getTime();

? ? ? return formatDate(currDate);

? }

? /**

? ? * Return the current date in the specified format

? ? *

? ? * @param strFormat

? ? * @return

? ? */

? public static String nowString(String pattern) {

? ? ? Calendar cal = Calendar.getInstance();

? ? ? Date currDate = cal.getTime();

? ? ? return format(currDate, pattern);

? }

? public static Timestamp parseTimestampDefault(String dateValue) {

? ? ? return new Timestamp(parse(dateValue, TIME_PATTERN_DEFAULT).getTime());

? }

? public static Timestamp parseTimestamp(String dateValue) {

? ? ? return new Timestamp(parse(dateValue, TIME_PATTERN_HHMMSS).getTime());

? }

? public static Timestamp parseTimestampYYMMDD(String dateValue) {

? ? ? return new Timestamp(parse(dateValue, DATE_PATTERN_DEFAULT).getTime());

? }


? public static Timestamp parseTimestamp(String dateValue,String partten) {

? ? ? return new Timestamp(parse(dateValue, partten).getTime());

? }

? public static Timestamp parseTimeNoStamp(String dateValue) {

? ? ? if(null==dateValue||dateValue.trim().length()==0) {

? ? ? ? dateValue=getNowDateString();?

? ? ? }

? ? ? return new Timestamp(parse(dateValue, DATE_PATTERN_DEFAULT).getTime());

? }

? public static String getNowDateString() {

? ? ? return format(new Date(),DATE_PATTERN_DEFAULT);

? }

? /**

? ? * Parse a string and return a date value

? ? *

? ? * @param dateValue

? ? * @return

? ? * @throws Exception

? ? */

? public static Date parseDate(String dateValue) {

? ? ? return parse(dateValue, DATE_PATTERN_DEFAULT);

? }

? /**

? ? * Parse a strign and return a datetime value

? ? *

? ? * @param dateValue

? ? * @return

? ? */

? public static Date parseTime(String dateValue) {

? ? ? return parse(dateValue, TIME_PATTERN_DEFAULT);

? }

? /**

? ? * Parse a string and return the date value in the specified format

? ? *

? ? * @param strFormat

? ? * @param dateValue

? ? * @return

? ? * @throws ParseException

? ? * @throws Exception

? ? */

? public static Date parse(String dateValue, String pattern) {

? ? ? if (StringUtils.isEmpty(dateValue))

? ? ? ? return null;

? ? ? SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);

? ? ? try {

? ? ? ? return dateFormat.parse(dateValue);

? ? ? } catch (ParseException pe) {

? ? ? ? return null;

? ? ? }

? }

? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串憋他。

? ? *

? ? * @param aTs_Datetime

? ? *? ? ? ? ? ? 需要轉(zhuǎn)換的日期孩饼。

? ? * @return 轉(zhuǎn)換后符合給定格式的日期字符串

? ? */

? public static String formatDate(Date d) {

? ? ? return format(d, DATE_PATTERN_DEFAULT);

? }

? public static String formatDate(Timestamp d) {

? ? ? return format(d, DATE_PATTERN_DEFAULT);

? }



? public static String formatDateddmmss(Date d) {

? ? ? return format(d, TIME_PATTERN_DEFAULT);

? }


? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串(只有數(shù)字)。

? ? *

? ? * @param aTs_Datetime

? ? *? ? ? ? ? ? 需要轉(zhuǎn)換的日期竹挡。

? ? * @return 轉(zhuǎn)換后符合給定格式的日期字符串

? ? */

? public static String formatTimeTargetStr(Date t) {

? ? ? String timestr = null;

? ? ? timestr = format(t, TIME_PATTERN_DEFAULT_STR);

? ? ? return timestr;

? }

? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串(只有數(shù)字)镀娶。

? ? *

? ? * @param aTs_Datetime

? ? *? ? ? ? ? ? 需要轉(zhuǎn)換的日期。

? ? * @return 轉(zhuǎn)換后符合給定格式的日期字符串

? ? */

? public String formatTimeStr(Date t) {

? ? ? String timestr = null;

? ? ? synchronized (this) {

? ? ? ? timestr = format(t, TIME_PATTERN_DEFAULT_STR);

? ? ? }

? ? ? return timestr;

? }

? /**

? ? * 豪秒 將Timestamp 類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串(只有數(shù)字)揪罕。

? ? *

? ? * @param aTs_Datetime

? ? *? ? ? ? ? ? 需要轉(zhuǎn)換的日期梯码。

? ? * @return 轉(zhuǎn)換后符合給定格式的日期字符串

? ? */

? public String formatTimeSSSSStr(Date t) {

? ? ? String timestr = null;

? ? ? synchronized (this) {

? ? ? ? timestr = format(t, TIME_PATTERN_SSSS_STR);

? ? ? }

? ? ? return timestr;

? }

? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串宝泵。

? ? *

? ? * @param aTs_Datetime

? ? *? ? ? ? ? ? 需要轉(zhuǎn)換的日期。

? ? * @return 轉(zhuǎn)換后符合給定格式的日期字符串

? ? */

? public static String formatTime(Date t) {

? ? ? return format(t, TIME_PATTERN_DEFAULT);

? }

? /**

? ? * 將Date類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串轩娶。

? ? *

? ? * @param aTs_Datetime

? ? * @param as_Pattern

? ? * @return

? ? */

? public static String format(Date d, String pattern) {

? ? ? if (d == null)

? ? ? ? return null;

? ? ? SimpleDateFormat dateFromat = new SimpleDateFormat(pattern);

? ? ? return dateFromat.format(d);

? }


? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換為系統(tǒng)參數(shù)定義的格式的字符串儿奶。

? ? *

? ? * @param t

? ? * @param pattern

? ? * @return

? ? */

? public static String format(Timestamp t, String pattern) {

? ? ? if (t == null)

? ? ? ? return null;

? ? ? ? Date date = new Date(t.getTime());


? ? ? ? return DateUtil.format(date, pattern);

? }


? /**

? ? * 將Timestamp類型的日期轉(zhuǎn)換Date類型。

? ? *

? ? * @param t

? ? * @return

? ? */

? public static Date timestamp2Date(Timestamp t) {

? ? ? if (t == null)

? ? ? ? return null;

? ? ? ? return new Date(t.getTime());

? }

? /**

? ? * 取得指定日期N天后的日期

? ? *

? ? * @param date

? ? * @param days

? ? * @return

? ? */

? public static Date addDays(Date date, int days) {

? ? ? Calendar cal = Calendar.getInstance();

? ? ? cal.setTime(date);

? ? ? cal.add(Calendar.DAY_OF_MONTH, days);

? ? ? return cal.getTime();

? }



更詳細(xì)的代碼https://github.com/Shimmer8618/sunshine

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳄抒,一起剝皮案震驚了整個(gè)濱河市闯捎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌许溅,老刑警劉巖瓤鼻,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闹司,居然都是意外死亡娱仔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門游桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牲迫,“玉大人,你說我怎么就攤上這事借卧№镌鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵铐刘,是天一觀的道長(zhǎng)陪每。 經(jīng)常有香客問我,道長(zhǎng)镰吵,這世上最難降的妖魔是什么檩禾? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮疤祭,結(jié)果婚禮上盼产,老公的妹妹穿的比我還像新娘。我一直安慰自己勺馆,他們只是感情好戏售,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著草穆,像睡著了一般灌灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悲柱,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天锋喜,我揣著相機(jī)與錄音,去河邊找鬼豌鸡。 笑死嘿般,一個(gè)胖子當(dāng)著我的面吹牛轴总,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播博个,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼功偿!你這毒婦竟也來了盆佣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤械荷,失蹤者是張志新(化名)和其女友劉穎共耍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吨瞎,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痹兜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颤诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片字旭。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崖叫,靈堂內(nèi)的尸體忽然破棺而出遗淳,到底是詐尸還是另有隱情,我是刑警寧澤心傀,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布屈暗,位于F島的核電站,受9級(jí)特大地震影響脂男,放射性物質(zhì)發(fā)生泄漏养叛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一宰翅、第九天 我趴在偏房一處隱蔽的房頂上張望弃甥。 院中可真熱鬧,春花似錦堕油、人聲如沸潘飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卜录。三九已至,卻和暖如春眶明,著一層夾襖步出監(jiān)牢的瞬間艰毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工搜囱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丑瞧,地道東北人柑土。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绊汹,于是被迫代替她去往敵國(guó)和親稽屏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容