Java常用公共工具记录
转载于:https://blog.csdn.net/Evankaka/article/details/72614601
1、日期处理工具
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- /**
- * 日期常用格式转换
- */
- public class DateTimeUtil {
- static {
- ymdhmsFormat = new SimpleDateFormat("yyyyMMddHHmmss");
- ymdhmsFormat2 = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
- ymdFormat = new SimpleDateFormat("yyyyMMdd");
- ymdFormat2 = new SimpleDateFormat("yyyy-MM-dd");
- hmsFormat = new SimpleDateFormat("HHmmss");
- ymFormat = new SimpleDateFormat("yyyyMM");
- c = Calendar.getInstance();
- }
- private static SimpleDateFormat ymdhmsFormat;
- private static SimpleDateFormat ymdhmsFormat2;
- private static SimpleDateFormat ymdFormat;
- private static SimpleDateFormat ymdFormat2;
- private static SimpleDateFormat hmsFormat;
- private static SimpleDateFormat ymFormat;//年月
- private static Calendar c;
- public static Date dateOnly(Date date) {
- return yyyyMMddToDate(parseToyyyyMMdd(date));
- }
- /**
- * 转换为 yyyyMMddHHmmss格式
- */
- public static String parseToyyyyMMddHHmmss(Date date) {
- if (date == null) {
- return null;
- }
- return ymdhmsFormat.format(date);
- }
- /**
- * 转换为 yyyyMMdd HH:mm:ss格式
- */
- public static String parseToyyyyMMddHHmmss2(Date date) {
- if (date == null) {
- return null;
- }
- return ymdhmsFormat2.format(date);
- }
- /**
- * 转换为HHmmss格式
- */
- public static String parseToHHmmss(Date date) {
- if (date == null) {
- return null;
- }
- return hmsFormat.format(date);
- }
- /**
- * 转换为yyyyMMdd格式
- */
- public static String parseToyyyyMMdd(Date date) {
- if (date == null) {
- return null;
- }
- return ymdFormat.format(date);
- }
- /**
- * 转换为yyyyMM格式
- */
- public static int parseToyyyyMM(Date date) {
- if (date == null) {
- return 0;
- }
- return Integer.valueOf(ymFormat.format(date));
- }
- public static Date yyyyMMddHHmmssToDate(String yyyyMMddHHmmss) {
- try {
- return ymdhmsFormat.parse(yyyyMMddHHmmss);
- }
- catch (Exception e) {
- return null;
- }
- }
- public static Date yyyyMMddToDate(String yyyyMMdd) {
- try {
- return ymdFormat.parse(yyyyMMdd);
- }
- catch (Exception e) {
- return null;
- }
- }
- public static Date yyyyMMToDate(String yyyyMM) {
- try {
- return ymFormat.parse(yyyyMM);
- }
- catch (Exception e) {
- return null;
- }
- }
- /**
- * yyyy-MM-dd转换成date
- * @author linbingwen
- * @since 2016年4月14日
- * @param yyyyMMdd2
- * @return
- */
- public static Date yyyyMMddToDate2(String yyyyMMdd2) {
- try {
- return ymdFormat2.parse(yyyyMMdd2);
- }
- catch (Exception e) {
- return null;
- }
- }
- public static Date HHmmssToDate(String HHmmss) {
- try {
- return hmsFormat.parse(HHmmss);
- }
- catch (Exception e) {
- return null;
- }
- }
- public static Date getDate(Date srcDate, Integer daysToAdd) {
- c.setTime(srcDate);
- c.add(Calendar.DATE, daysToAdd); // number of days to add
- return c.getTime();
- }
- public static Date yyyyMMddHHmmssToDate2(String yyyyMMddHHmmss) {
- try {
- return ymdhmsFormat2.parse(yyyyMMddHHmmss);
- }
- catch (Exception e) {
- return null;
- }
- }
- public static final int daysBetween(Date early, Date late) {
- java.util.Calendar calst = java.util.Calendar.getInstance();
- java.util.Calendar caled = java.util.Calendar.getInstance();
- calst.setTime(early);
- caled.setTime(late);
- // 设置时间为0时
- calst.set(java.util.Calendar.HOUR_OF_DAY, 0);
- calst.set(java.util.Calendar.MINUTE, 0);
- calst.set(java.util.Calendar.SECOND, 0);
- caled.set(java.util.Calendar.HOUR_OF_DAY, 0);
- caled.set(java.util.Calendar.MINUTE, 0);
- caled.set(java.util.Calendar.SECOND, 0);
- // 得到两个日期相差的天数
- int days = ((int) (caled.getTime().getTime() / 1000) - (int) (calst.getTime().getTime() / 1000)) / 3600 / 24;
- return days;
- }
- public static Date getNextDayOfWeek(Date date, int dayOfWeek) {
- if (dayOfWeek == 0) {
- dayOfWeek = 7;
- }
- if (dayOfWeek > 7 || dayOfWeek < 1) {
- throw new RuntimeException("星期:" + dayOfWeek + "不存在");
- }
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- while (true) {
- int day = cal.get(Calendar.DAY_OF_WEEK);
- if (preWeekDay(day) == dayOfWeek) {
- return cal.getTime();
- }
- cal.add(Calendar.DATE, 1);
- }
- }
- public static Date getNextMonthDate(Date date, int nextMonthDate) {
- Calendar cal = Calendar.getInstance();
- cal.setTime(date);
- int day = cal.get(Calendar.DATE);
- if (day <= nextMonthDate) {
- cal.set(Calendar.DATE, nextMonthDate);
- }
- else {
- cal.set(Calendar.DATE, 1);
- cal.add(Calendar.MONTH, 1);
- cal.set(Calendar.DATE, nextMonthDate);
- }
- return cal.getTime();
- }
- public static int nextWeekDay(int day) {
- if (day == 7) {
- return 1;
- }
- else {
- return day++;
- }
- }
- public static int preWeekDay(int day) {
- if (day == 1) {
- return 7;
- }
- else {
- return day - 1;
- }
- }
- /**
- * 计算两个日期相差的天数
- * @param beginDate 【YYYYMMDD】
- * @param endDate 【YYYYMMDD】
- * @return Integer
- * @author linbingwen
- * @since 2015年7月21日
- */
- public static long diffDate(Date beginDate,Date endDate){
- Calendar theCa1= Calendar.getInstance();
- Calendar theCa2= Calendar.getInstance();
- theCa1.setTime(beginDate);
- theCa2.setTime(endDate);
- long between_days=(theCa2.getTimeInMillis()-theCa1.getTimeInMillis())/(1000*3600*24);
- return between_days;
- }
- /**
- * 分钟差
- * @Title: diffMinute
- * @Description: TODO
- * @author : liuqiuyun
- * @param @param beginDate
- * @param @param endDate
- * @param @return 设定文件
- * @return long 返回类型
- * @throws
- */
- public static long diffMinute(Date beginDate,Date endDate){
- Calendar theCa1= Calendar.getInstance();
- Calendar theCa2= Calendar.getInstance();
- theCa1.setTime(beginDate);
- theCa2.setTime(endDate);
- long between_minutes=(theCa2.getTimeInMillis()-theCa1.getTimeInMillis())/(1000*60);
- return between_minutes;
- }
- /**
- * 获取月份差第一天
- * @Title: getMonthFirstDate
- * @Description: TODO
- * @author : liuqiuyun
- * @param @param date
- * @param @param monthToAdd
- * @param @param minOrMax 月初还是月末
- * @param @return 设定文件
- * @return Date 返回类型
- * @throws
- */
- public static Date getMonthFirstDate(Date date,int monthToAdd, String minOrMax) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- calendar.add(Calendar.MONTH, monthToAdd);
- if(minOrMax.equals("min")){
- calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
- }else if(minOrMax.equals("max")){
- calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
- }
- return calendar.getTime();
- }
- public static long getLastMonth(Date date) {
- Date lastDate = getMonthFirstDate(date,-1,"min");
- long lastMonth = parseToyyyyMM(lastDate);
- return lastMonth;
- }
- public static void main(String[] args) throws InterruptedException {
- // Calendar cal = Calendar.getInstance();
- // System.out.println(" cal.get(Calendar.DAY_OF_WEEK);:" + cal.get(Calendar.DAY_OF_WEEK));
- // System.out.println(" cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);:" + cal.get(Calendar.DAY_OF_WEEK_IN_MONTH));
- //
- // System.out.println(getNextDayOfWeek(cal.getTime(), 0));
- // System.out.println(getNextDayOfWeek(cal.getTime(), 7));
- // System.out.println(getNextDayOfWeek(cal.getTime(), 1));
- // System.out.println(getNextDayOfWeek(cal.getTime(), 2));
- //
- // System.out.println(getNextMonthDate(cal.getTime(), 0));
- // System.out.println(parseToyyyyMMdd(getNextMonthDate(cal.getTime(), 15)));
- System.out.println(parseToyyyyMMdd(getMonthFirstDate(yyyyMMddToDate("20160618"),-1,"max")));
- // System.out.println(yyyyMMddToDate2("2012-09-01"));
- //
- // Date start = new Date();
- // System.out.println(start);
- // Thread.sleep(60*1000*5+1000);
- // Date end = new Date();
- // System.out.println(end);
- // System.out.println(diffMinute(start,end));
- }
- }
2、http请求处理工具
- import java.io.ByteArrayInputStream;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.HttpURLConnection;
- import java.net.Proxy;
- import java.net.URL;
- import java.security.SecureRandom;
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import java.util.Map;
- import javax.net.ssl.HostnameVerifier;
- import javax.net.ssl.HttpsURLConnection;
- import javax.net.ssl.KeyManager;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLSession;
- import javax.net.ssl.TrustManager;
- import javax.net.ssl.X509TrustManager;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- //import com.lz.common.util.http.FileItem;
- public class HttpClientUtil {
- private static Logger logger = LoggerFactory
- .getLogger(HttpClientUtil.class);
- public static void main(String[] args) {
- HttpURLConnection conn = null;
- InputStream ins = null;
- try {
- // String boundary = System.currentTimeMillis() + "";
- // String ctype = "multipart/form-data;boundary=" + boundary;
- // conn = HttpClientUtil
- // .getConnection(
- // null,
- // new URL(
- // "http://10.75.201.68:8888/cfile/file/image?imageId=group2/M00/05/64/CkvJo1cQVPyATVbKACIyO0-AKoo7735712"),
- // "GET", ctype, null);
- // conn.setConnectTimeout(1000);
- // conn.setReadTimeout(5000);
- byte[] bytes = downLoadFile("http://10.75.201.68:8888/cfile/file/image?imageId=group2/M00/05/64/CkvJo1cQVPyATVbKACIyO0-AKoo7735712");
- InputStream inputStream =new ByteArrayInputStream(bytes);
- // ins = conn.getInputStream();
- File file = new File("D:/6.docx");
- FileOutputStream fot = new FileOutputStream(file);
- com.slob.util.io.IOUtil.inputStreamToOutputStream(inputStream, fot);
- } catch (Exception e) {
- }
- }
- public static byte[] downLoadFile(String url) throws IOException {
- HttpURLConnection conn = null;
- InputStream ins = null;
- byte[] bytes = null;
- try {
- String boundary = System.currentTimeMillis() + "";
- String ctype = "multipart/form-data;boundary=" + boundary;
- conn = HttpClientUtil.getConnection(null,new URL(url),"GET", ctype, null);
- conn.setConnectTimeout(1000);
- conn.setReadTimeout(5000);
- ins = conn.getInputStream();
- bytes = readBytes(ins);
- return bytes;
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (ins != null) {
- ins.close();
- }
- if (conn != null) {
- conn.disconnect();
- }
- }
- }
- public static String uploadFile(String url, String fieldName,
- String fileName, InputStream ips, ResponseProcess respProcess)
- throws IOException {
- HttpURLConnection conn = null;
- OutputStream out = null;
- try {
- String boundary = System.currentTimeMillis() + "";
- String ctype = "multipart/form-data;boundary=" + boundary;
- conn = HttpClientUtil.getConnection(null, new URL(url), "POST",
- ctype, null);
- conn.setConnectTimeout(1000);
- conn.setReadTimeout(5000);
- out = conn.getOutputStream();
- byte[] entryBoundaryBytes = ("\r\n--" + boundary + "\r\n")
- .getBytes("UTF-8");
- out.write(entryBoundaryBytes);
- byte[] data = new byte[1024 * 1024];
- int size = ips.read(data);
- byte[] fileBytes = getFileEntry(fieldName, fileName,
- getMimeType(data), "UTF-8");
- out.write(fileBytes);
- while (size > 0) {
- out.write(data, 0, size);
- size = ips.read(data);
- }
- byte[] endBoundaryBytes = ("\r\n--" + boundary + "--\r\n")
- .getBytes("UTF-8");
- out.write(endBoundaryBytes);
- return respProcess.processResponse(conn);
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (out != null) {
- out.close();
- }
- if (conn != null) {
- conn.disconnect();
- }
- }
- }
- // public static String doPost(Proxy proxy, String url, String requestType,
- // Map<String, String> params,
- // Map<String, FileItem> fileParams, String charset, int connectTimeout, int
- // readTimeout,
- // Map<String, String> headerMap, ResponseProcess respProcess) throws
- // IOException {
- //
- // String boundary = System.currentTimeMillis() + "";
- // HttpURLConnection conn = null;
- // OutputStream out = null;
- // String rsp = null;
- // try {
- // try {
- // String ctype = "multipart/form-data;boundary=" + boundary;
- // conn = getConnection(proxy, new URL(url), requestType, ctype, headerMap);
- // conn.setConnectTimeout(connectTimeout);
- // conn.setReadTimeout(readTimeout);
- // }
- // catch (IOException e) {
- // logger.error(url, e);
- // throw e;
- // }
- //
- // try {
- // out = conn.getOutputStream();
- //
- // byte[] entryBoundaryBytes = ("\r\n--" + boundary +
- // "\r\n").getBytes(charset);
- //
- // if (params != null) {
- // // 文本
- // Set<Entry<String, String>> textEntrySet = params.entrySet();
- // for (Entry<String, String> textEntry : textEntrySet) {
- // byte[] textBytes = getTextEntry(textEntry.getKey(), textEntry.getValue(),
- // charset);
- // out.write(entryBoundaryBytes);
- // out.write(textBytes);
- // }
- // }
- //
- // // 文件
- // if (fileParams != null) {
- // Set<Entry<String, FileItem>> fileEntrySet = fileParams.entrySet();
- // for (Entry<String, FileItem> fileEntry : fileEntrySet) {
- // FileItem fileItem = fileEntry.getValue();
- // if (fileItem.getContent() == null) {
- // continue;
- // }
- // byte[] fileBytes = getFileEntry(fileEntry.getKey(),
- // fileItem.getFileName(),
- // fileItem.getMimeType(), charset);
- // out.write(entryBoundaryBytes);
- // out.write(fileBytes);
- // out.write(fileItem.getContent());
- // }
- // }
- //
- // byte[] endBoundaryBytes = ("\r\n--" + boundary +
- // "--\r\n").getBytes(charset);
- // out.write(endBoundaryBytes);
- // rsp = respProcess.processResponse(conn);
- // }
- // catch (IOException e) {
- // logger.error(url, e);
- // throw e;
- // }
- // }
- // finally {
- // if (out != null) {
- // out.close();
- // }
- // if (conn != null) {
- // conn.disconnect();
- // }
- // }
- //
- // return rsp;
- // }
- public static String doGet(Proxy proxy, String url, String charset,
- ResponseProcess respProcess) throws IOException {
- if (url == null) {
- return "";
- }
- HttpURLConnection conn = null;
- String rsp = null;
- try {
- String ctype = "application/x-www-form-urlencoded;charset="
- + charset;
- conn = getConnection(proxy, new URL(url), "GET", ctype, null);
- rsp = respProcess.processResponse(conn);
- } catch (IOException e) {
- logger.error(url, e);
- throw e;
- } finally {
- if (conn != null) {
- conn.disconnect();
- }
- }
- return rsp;
- }
- private static class DefaultTrustManager implements X509TrustManager {
- public X509Certificate[] getAcceptedIssuers() {
- return null;
- }
- public void checkClientTrusted(X509Certificate[] chain, String authType)
- throws CertificateException {
- }
- public void checkServerTrusted(X509Certificate[] chain, String authType)
- throws CertificateException {
- }
- }
- public static HttpURLConnection getConnection(Proxy proxy, URL url,
- String method, String ctype, Map<String, String> headerMap)
- throws IOException {
- HttpURLConnection conn = null;
- if ("https".equals(url.getProtocol())) {
- SSLContext ctx = null;
- try {
- ctx = SSLContext.getInstance("TLS");
- ctx.init(new KeyManager[0],
- new TrustManager[] { new DefaultTrustManager() },
- new SecureRandom());
- } catch (Exception e) {
- throw new IOException(e);
- }
- HttpsURLConnection connHttps;
- if (proxy != null) {
- connHttps = (HttpsURLConnection) url.openConnection(proxy);
- } else {
- connHttps = (HttpsURLConnection) url.openConnection();
- }
- connHttps.setSSLSocketFactory(ctx.getSocketFactory());
- connHttps.setHostnameVerifier(new HostnameVerifier() {
- public boolean verify(String hostname, SSLSession session) {
- return true;
- }
- });
- conn = connHttps;
- } else {
- if (proxy != null) {
- conn = (HttpURLConnection) url.openConnection(proxy);
- } else {
- conn = (HttpURLConnection) url.openConnection();
- }
- }
- conn.setRequestMethod(method);
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setRequestProperty("Accept",
- "text/xml,text/javascript,text/html,application/json");
- conn.setRequestProperty("User-Agent", "java");
- conn.setRequestProperty("Content-Type", ctype);
- if (headerMap != null) {
- for (Map.Entry<String, String> entry : headerMap.entrySet()) {
- conn.setRequestProperty(entry.getKey(), entry.getValue());
- }
- }
- return conn;
- }
- private static byte[] getTextEntry(String fieldName, String fieldValue,
- String charset) throws IOException {
- StringBuilder entry = new StringBuilder();
- entry.append("Content-Disposition:form-data;name=\"");
- entry.append(fieldName);
- entry.append("\"\r\nContent-Type:text/plain\r\n\r\n");
- entry.append(fieldValue);
- return entry.toString().getBytes(charset);
- }
- private static byte[] getFileEntry(String fieldName, String fileName,
- String mimeType, String charset) throws IOException {
- StringBuilder entry = new StringBuilder();
- entry.append("Content-Disposition:form-data;name=\"");
- entry.append(fieldName);
- entry.append("\";filename=\"");
- entry.append(fileName);
- entry.append("\"\r\nContent-Type:");
- entry.append(mimeType);
- entry.append("\r\n\r\n");
- return entry.toString().getBytes(charset);
- }
- public static interface ResponseProcess {
- String processResponse(HttpURLConnection conn);
- };
- public static String getMimeType(byte[] bytes) {
- String suffix = getFileSuffix(bytes);
- String mimeType;
- if ("JPG".equals(suffix)) {
- mimeType = "image/jpeg";
- } else if ("GIF".equals(suffix)) {
- mimeType = "image/gif";
- } else if ("PNG".equals(suffix)) {
- mimeType = "image/png";
- } else if ("BMP".equals(suffix)) {
- mimeType = "image/bmp";
- } else {
- mimeType = "application/octet-stream";
- }
- return mimeType;
- }
- /**
- * 获取文件的真实后缀名。目前只支持JPG, GIF, PNG, BMP四种图片文件。
- *
- * @param bytes
- * 文件字节流
- * @return JPG, GIF, PNG or null
- */
- public static String getFileSuffix(byte[] bytes) {
- if (bytes == null || bytes.length < 10) {
- return null;
- }
- if (bytes[0] == 'G' && bytes[1] == 'I' && bytes[2] == 'F') {
- return "GIF";
- } else if (bytes[1] == 'P' && bytes[2] == 'N' && bytes[3] == 'G') {
- return "PNG";
- } else if (bytes[6] == 'J' && bytes[7] == 'F' && bytes[8] == 'I'
- && bytes[9] == 'F') {
- return "JPG";
- } else if (bytes[0] == 'B' && bytes[1] == 'M') {
- return "BMP";
- } else {
- return null;
- }
- }
- public static byte[] readBytes(InputStream in) throws IOException {
- byte[] temp = new byte[in.available()];
- byte[] result = new byte[0];
- int size = 0;
- while ((size = in.read(temp)) != -1) {
- byte[] readBytes = new byte[size];
- System.arraycopy(temp, 0, readBytes, 0, size);
- result = mergeArray(result,readBytes);
- }
- return result;
- }
- public static byte[] mergeArray(byte[]... a) {
- // 合并完之后数组的总长度
- int index = 0;
- int sum = 0;
- for (int i = 0; i < a.length; i++) {
- sum = sum + a[i].length;
- }
- byte[] result = new byte[sum];
- for (int i = 0; i < a.length; i++) {
- int lengthOne = a[i].length;
- if(lengthOne==0){
- continue;
- }
- // 拷贝数组
- System.arraycopy(a[i], 0, result, index, lengthOne);
- index = index + lengthOne;
- }
- return result;
- }
- }
3、图像处理工具
- import java.awt.image.BufferedImage;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import javax.imageio.ImageIO;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- /**
- *
- * 功能概要:图片处理工具类
- *
- * @author linbingwen
- * @since 2016年3月30日
- */
- public class ImageUtil {
- /**
- * 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
- *
- * @author linbingwen
- * @since 2016年3月30日
- * @param imgFilePath 图片路径
- * @return base64编码的字符串
- * @throws IOException
- */
- public static String imageToBase64(String imgFilePath) throws IOException {
- byte[] data = null;
- InputStream in = null;
- try {
- in = new FileInputStream(imgFilePath);
- data = new byte[in.available()]; // 读取图片字节数组
- in.read(data);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (in != null) {
- in.close();
- }
- }
- BASE64Encoder encoder = new BASE64Encoder();// 对字节数组Base64编码
- return encoder.encode(data);// 返回Base64编码过的字节数组字符串
- }
- /**
- * 对字节数组字符串进行Base64解码并生成图片
- *
- * @author linbingwen
- * @since 2016年3月30日
- * @param imgStr base64编码的数据
- * @param imgFilePath 要保存的图片路径
- * @param imgFileName 要保存的图片名
- * @return
- * @throws IOException
- */
- public static Boolean base64ToImage(String base64, String imgFilePath,String imgFileName) throws IOException {
- if (base64 == null) {
- return null;
- }
- BASE64Decoder decoder = new BASE64Decoder();
- OutputStream out = null;
- try {
- byte[] bytes = decoder.decodeBuffer(base64);// Base64解码
- for (int i = 0; i < bytes.length; ++i) {
- if (bytes[i] < 0) {// 调整异常数据
- bytes[i] += 256;
- }
- }
- InputStream input = new ByteArrayInputStream(bytes);
- out = new FileOutputStream(imgFilePath + imgFileName);// 生成jpeg图片
- out.write(bytes);
- out.flush();
- return true;
- } catch (Exception e) {
- return false;
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }
- /**
- * 将base64编码的字符串转成InputStream
- * @author linbingwen
- * @since 2016年3月30日
- * @param base64
- * @return InputStream
- */
- public static InputStream base64ToInputStream(String base64) {
- if (base64 == null) {
- return null;
- }
- BASE64Decoder decoder = new BASE64Decoder();
- try {
- byte[] bytes = decoder.decodeBuffer(base64);// Base64解码
- for (int i = 0; i < bytes.length; ++i) {
- if (bytes[i] < 0) {// 调整异常数据
- bytes[i] += 256;
- }
- }
- InputStream input = new ByteArrayInputStream(bytes);
- return input;
- } catch (Exception e) {
- return null;
- }
- }
- /**
- * 将网络图片进行Base64位编码
- * @author linbingwen
- * @since 2016年3月30日
- * @param imageUrl 图片的url路径,如http://.....xx.jpg
- * @return 返回Base64编码过的字节数组字符串
- * @throws IOException
- */
- public static String imageUrlToBase64(String imageUrl) throws IOException {
- ByteArrayOutputStream outputStream = null;
- try {
- URL url = new URL(imageUrl);
- BufferedImage bufferedImage = ImageIO.read(url);
- outputStream = new ByteArrayOutputStream();
- ImageIO.write(bufferedImage, "jpg", outputStream);
- } catch (MalformedURLException e1) {
- e1.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (outputStream != null) {
- outputStream.close();
- }
- }
- BASE64Encoder encoder = new BASE64Encoder();// 对字节数组Base64编码
- return encoder.encode(outputStream.toByteArray());
- }
- /**
- *
- * @author linbingwen
- * @since 2016年4月13日
- * @param imageUrl 图片url
- * @param imageType 图片格式 如 jpg/bmp/png
- * @return
- * @throws IOException
- */
- public static byte[] imageUrlToBytes(String imageUrl,String imageType) throws IOException {
- ByteArrayOutputStream outputStream = null;
- byte[] bytes = null;
- try {
- URL url = new URL(imageUrl);
- BufferedImage bufferedImage = ImageIO.read(url);
- outputStream = new ByteArrayOutputStream();
- ImageIO.write(bufferedImage, imageType, outputStream);
- bytes = outputStream.toByteArray();
- } catch (MalformedURLException e1) {
- e1.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (outputStream != null) {
- outputStream.close();
- }
- }
- return bytes;
- }
- public static void main(String[] args) throws IOException {
- String imgFilePath = "D:\\";
- String ttString = imageUrlToBase64("http://10.75.201.68:8888/cfile/file/image?imageId=group2/M00/05/25/CkvJolb5nIOAcHMZAADU5zn6AlI7014866");
- base64ToImage(ttString, imgFilePath, "44.bmp");
- urlBase64ToFile("http://10.75.201.68:8888/cfile/file/image?imageId=group2/M00/05/97/CkvJo1dxbqKAEBqzAARHjfpHsPk7518600");
- }
- /**
- * @author linbingwen
- * @since 2016年6月28日
- * @param string
- */
- private static void urlBase64ToFile(String string) {
- }
- }
4、JSON转换处理工具
- /**
- * 功能概要:java与json转换工具类
- *
- * @author linbingwen
- * @since 2016年4月20日
- */
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import net.sf.ezmorph.MorpherRegistry;
- import net.sf.ezmorph.object.DateMorpher;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import net.sf.json.JsonConfig;
- import net.sf.json.processors.JsonValueProcessor;
- import net.sf.json.util.JSONUtils;
- import net.sf.json.xml.XMLSerializer;
- public class JsonUtil {
- private static String YYYY_MM_DD = "yyyy-MM-dd";
- private static String YYYY_MM_DD_HH_MM_ss = "yyyy-MM-dd HH:mm:ss";
- private static String HH_MM_ss = "HH-mm-ss";
- private static String YYYYMMDD = "yyyyMMdd";
- private static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
- private static String HHMMss = "HHmmss";
- /**
- * 设置日期转换格式
- */
- static {
- //注册器
- MorpherRegistry mr = JSONUtils.getMorpherRegistry();
- //可转换的日期格式,即Json串中可以出现以下格式的日期与时间
- DateMorpher dm = new DateMorpher(new String[] { YYYY_MM_DD,
- YYYY_MM_DD_HH_MM_ss, HH_MM_ss, YYYYMMDD,
- YYYYMMDDHHMMSS, HHMMss});
- mr.registerMorpher(dm);
- }
- /**
- * 从json串转换成实体对象
- * @param jsonObjStr e.g. {'name':'get','dateAttr':'2009-11-12'}
- * @param clazz Person.class
- * @return
- */
- public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz) {
- return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz);
- }
- /**
- * 从json串转换成实体对象,并且实体集合属性存有另外实体Bean
- * @param jsonObjStr e.g. {'data':[{'name':'get'},{'name':'set'}]}
- * @param clazz e.g. MyBean.class
- * @param classMap e.g. classMap.put("data", Person.class)
- * @return Object
- */
- public static Object getDtoFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) {
- return JSONObject.toBean(JSONObject.fromObject(jsonObjStr), clazz, classMap);
- }
- /**
- * 把一个json数组串转换成普通数组
- * @param jsonArrStr e.g. ['get',1,true,null]
- * @return Object[]
- */
- public static Object[] getArrFromJsonArrStr(String jsonArrStr) {
- return JSONArray.fromObject(jsonArrStr).toArray();
- }
- /**
- * 把一个json数组串转换成实体数组
- * @param jsonArrStr e.g. [{'name':'get'},{'name':'set'}]
- * @param clazz e.g. Person.class
- * @return Object[]
- */
- public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz) {
- JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);
- Object[] objArr = new Object[jsonArr.size()];
- for (int i = 0; i < jsonArr.size(); i++) {
- objArr[i] = JSONObject.toBean(jsonArr.getJSONObject(i), clazz);
- }
- return objArr;
- }
- /**
- * 把一个json数组串转换成实体数组,且数组元素的属性含有另外实例Bean
- * @param jsonArrStr e.g. [{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}]
- * @param clazz e.g. MyBean.class
- * @param classMap e.g. classMap.put("data", Person.class)
- * @return Object[]
- */
- public static Object[] getDtoArrFromJsonArrStr(String jsonArrStr, Class clazz,
- Map classMap) {
- JSONArray array = JSONArray.fromObject(jsonArrStr);
- Object[] obj = new Object[array.size()];
- for (int i = 0; i < array.size(); i++) {
- JSONObject jsonObject = array.getJSONObject(i);
- obj[i] = JSONObject.toBean(jsonObject, clazz, classMap);
- }
- return obj;
- }
- /**
- * 把一个json数组串转换成存放普通类型元素的集合
- * @param jsonArrStr e.g. ['get',1,true,null]
- * @return List
- */
- public static List getListFromJsonArrStr(String jsonArrStr) {
- JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);
- List list = new ArrayList();
- for (int i = 0; i < jsonArr.size(); i++) {
- list.add(jsonArr.get(i));
- }
- return list;
- }
- /**
- * 把一个json数组串转换成集合,且集合里存放的为实例Bean
- * @param jsonArrStr e.g. [{'name':'get'},{'name':'set'}]
- * @param clazz
- * @return List
- */
- public static List getListFromJsonArrStr(String jsonArrStr, Class clazz) {
- JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);
- List list = new ArrayList();
- for (int i = 0; i < jsonArr.size(); i++) {
- list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz));
- }
- return list;
- }
- /**
- * 把一个json数组串转换成集合,且集合里的对象的属性含有另外实例Bean
- * @param jsonArrStr e.g. [{'data':[{'name':'get'}]},{'data':[{'name':'set'}]}]
- * @param clazz e.g. MyBean.class
- * @param classMap e.g. classMap.put("data", Person.class)
- * @return List
- */
- public static List getListFromJsonArrStr(String jsonArrStr, Class clazz, Map classMap) {
- JSONArray jsonArr = JSONArray.fromObject(jsonArrStr);
- List list = new ArrayList();
- for (int i = 0; i < jsonArr.size(); i++) {
- list.add(JSONObject.toBean(jsonArr.getJSONObject(i), clazz, classMap));
- }
- return list;
- }
- /**
- * 把json对象串转换成map对象
- * @param jsonObjStr e.g. {'name':'get','int':1,'double',1.1,'null':null}
- * @return Map
- */
- public static Map getMapFromJsonObjStr(String jsonObjStr) {
- JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);
- Map map = new HashMap();
- for (Iterator iter = jsonObject.keys(); iter.hasNext();) {
- String key = (String) iter.next();
- map.put(key, jsonObject.get(key));
- }
- return map;
- }
- /**
- * 把json对象串转换成map对象,且map对象里存放的为其他实体Bean
- * @param jsonObjStr e.g. {'data1':{'name':'get'},'data2':{'name':'set'}}
- * @param clazz e.g. Person.class
- * @return Map
- */
- public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz) {
- JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);
- Map map = new HashMap();
- for (Iterator iter = jsonObject.keys(); iter.hasNext();) {
- String key = (String) iter.next();
- map.put(key, JSONObject.toBean(jsonObject.getJSONObject(key), clazz));
- }
- return map;
- }
- /**
- * 把json对象串转换成map对象,且map对象里存放的其他实体Bean还含有另外实体Bean
- * @param jsonObjStr e.g. {'mybean':{'data':[{'name':'get'}]}}
- * @param clazz e.g. MyBean.class
- * @param classMap e.g. classMap.put("data", Person.class)
- * @return Map
- */
- public static Map getMapFromJsonObjStr(String jsonObjStr, Class clazz, Map classMap) {
- JSONObject jsonObject = JSONObject.fromObject(jsonObjStr);
- Map map = new HashMap();
- for (Iterator iter = jsonObject.keys(); iter.hasNext();) {
- String key = (String) iter.next();
- map.put(key, JSONObject
- .toBean(jsonObject.getJSONObject(key), clazz, classMap));
- }
- return map;
- }
- /**
- * 把实体Bean、Map对象、数组、列表集合转换成Json串
- * @param obj
- * @return
- * @throws Exception String
- */
- public static String getJsonStr(Object obj) {
- String jsonStr = null;
- //Json配置
- // JsonConfig jsonCfg = new JsonConfig();
- //
- // //注册日期处理器
- // jsonCfg.registerJsonValueProcessor(java.util.Date.class,
- // new JsonDateValueProcessor(YYYY_MM_DD_HH_MM_ss));
- if (obj == null) {
- return "{}";
- }
- if (obj instanceof Collection || obj instanceof Object[]) {
- jsonStr = JSONArray.fromObject(obj).toString();
- } else {
- jsonStr = JSONObject.fromObject(obj).toString();
- }
- return jsonStr;
- }
- /**
- * 把json串、数组、集合(collection map)、实体Bean转换成XML
- * XMLSerializer API:
- * http://json-lib.sourceforge.net/apidocs/net/sf/json/xml/XMLSerializer.html
- * 具体实例请参考:
- * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html
- * http://json-lib.sourceforge.net/xref-test/net/sf/json/xml/TestXMLSerializer_writes.html
- * @param obj
- * @return
- * @throws Exception String
- */
- public static String getXMLFromObj(Object obj) {
- XMLSerializer xmlSerial = new XMLSerializer();
- //Json配置
- JsonConfig jsonCfg = new JsonConfig();
- //注册日期处理器
- jsonCfg.registerJsonValueProcessor(java.util.Date.class,
- new JsonDateValueProcessor(YYYY_MM_DD_HH_MM_ss));
- if ((String.class.isInstance(obj) && String.valueOf(obj).startsWith("["))
- || obj.getClass().isArray() || Collection.class.isInstance(obj)) {
- JSONArray jsonArr = JSONArray.fromObject(obj, jsonCfg);
- return xmlSerial.write(jsonArr);
- } else {
- JSONObject jsonObj = JSONObject.fromObject(obj, jsonCfg);
- return xmlSerial.write(jsonObj);
- }
- }
- /**
- * 从XML转json串
- * @param xml
- * @return String
- */
- public static String getJsonStrFromXML(String xml) {
- XMLSerializer xmlSerial = new XMLSerializer();
- return String.valueOf(xmlSerial.read(xml));
- }
- }
- /**
- *
- * 功能概要:json日期值处理器实现
- *
- * @author linbingwen
- * @since 2016年4月20日
- */
- class JsonDateValueProcessor implements JsonValueProcessor {
- private String format ="yyyy-MM-dd HH-mm-ss";
- public JsonDateValueProcessor() {
- }
- public JsonDateValueProcessor(String format) {
- this.format = format;
- }
- public Object processArrayValue(Object value, JsonConfig jsonConfig) {
- return process(value, jsonConfig);
- }
- public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
- return process(value, jsonConfig);
- }
- private Object process(Object value, JsonConfig jsonConfig) {
- if (value instanceof Date) {
- String str = new SimpleDateFormat(format).format((Date) value);
- return str;
- }
- return value == null ? null : value.toString();
- }
- public String getFormat() {
- return format;
- }
- public void setFormat(String format) {
- this.format = format;
- }
- }
5、邮件发送处理工具
- import java.util.Properties;
- import javax.activation.DataHandler;
- import javax.activation.FileDataSource;
- import javax.mail.Address;
- import javax.mail.BodyPart;
- import javax.mail.Message;
- import javax.mail.Multipart;
- import javax.mail.PasswordAuthentication;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeBodyPart;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeMultipart;
- import javax.mail.internet.MimeUtility;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class MailSendUtil {
- private static Logger logger = LoggerFactory.getLogger(MailSendUtil.class);
- private MimeMessage mimeMsg; // MIME邮件对象
- private Session session; // 邮件会话对象
- private Properties props; // 系统属性
- private boolean needAuth = false; // smtp是否需要认证
- private String username; // smtp认证用户名
- private String password; // smtp认证用户密码
- private Multipart mp; // 含标题,邮件内容,附件
- /**
- * Constructor
- *
- * @param smtp
- * 邮件发送服务器
- */
- public MailSendUtil(String smtp) {
- setSmtpHost(smtp);
- createMimeMessage();
- }
- /**
- * 设置邮件发送服务器
- *
- * @param hostName
- * String
- */
- public void setSmtpHost(String hostName) {
- logger.info("设置系统属性:mail.smtp.host = " + hostName);
- if (props == null)
- props = System.getProperties(); // 获得系统属性对象
- props.put("mail.smtp.host", hostName); // 设置SMTP主机
- }
- /**
- * 创建MIME邮件对象
- *
- * @return
- */
- public boolean createMimeMessage() {
- try {
- logger.info("准备获取邮件会话对象!");
- session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
- });// 获得邮件会话对象
- }
- catch (Exception e) {
- logger.error("获取邮件会话对象时发生错误!" + e);
- return false;
- }
- logger.info("准备创建MIME邮件对象!");
- try {
- mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
- mp = new MimeMultipart();
- return true;
- }
- catch (Exception e) {
- logger.error("创建MIME邮件对象失败!" + e);
- return false;
- }
- }
- /**
- * 设置SMTP是否需要验证
- *
- * @param need
- */
- public void setNeedAuth(boolean need) {
- logger.info("设置smtp身份认证:mail.smtp.auth = " + need);
- if (props == null)
- props = System.getProperties();
- if (need) {
- props.put("mail.smtp.auth", "true");
- }
- else {
- props.put("mail.smtp.auth", "false");
- }
- }
- /**
- * 设置用户名和密码
- *
- * @param name
- * @param pass
- */
- public void setNamePass(String name, String pass) {
- username = name;
- password = pass;
- }
- /**
- * 设置邮件主题
- *
- * @param mailSubject
- * @return
- */
- public boolean setSubject(String mailSubject) {
- logger.info("设置邮件主题!");
- try {
- mimeMsg.setSubject(mailSubject);
- return true;
- }
- catch (Exception e) {
- logger.error("设置邮件主题发生错误!");
- return false;
- }
- }
- /**
- * 设置邮件正文
- *
- * @param mailBody
- * String
- */
- public boolean setBody(String mailBody) {
- try {
- BodyPart bp = new MimeBodyPart();
- bp.setContent("" + mailBody, "text/html;charset=GBK");
- mp.addBodyPart(bp);
- return true;
- }
- catch (Exception e) {
- logger.error("设置邮件正文时发生错误!" + e);
- return false;
- }
- }
- /**
- * 添加附件
- *
- * @param filename
- * String
- */
- public boolean addFileAffix(String filename) {
- if (filename == null) {
- return true;
- }
- logger.info("增加邮件附件:" + filename);
- try {
- BodyPart bp = new MimeBodyPart();
- FileDataSource fileds = new FileDataSource(filename);
- bp.setDataHandler(new DataHandler(fileds));
- bp.setFileName(MimeUtility.encodeText(fileds.getName()));
- mp.addBodyPart(bp);
- return true;
- }
- catch (Exception e) {
- logger.error("增加邮件附件:" + filename + "发生错误!" + e);
- return false;
- }
- }
- /**
- * 设置发信人
- *
- * @param from
- * String
- */
- public boolean setFrom(String from) {
- logger.info("设置发信人!");
- try {
- mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
- return true;
- }
- catch (Exception e) {
- return false;
- }
- }
- /**
- * 设置收信人
- *
- * @param to
- * String
- */
- public boolean setTo(String to) {
- logger.info("设置收件人:" + to);
- if (to == null)
- return false;
- try {
- mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
- return true;
- }
- catch (Exception e) {
- return false;
- }
- }
- /**
- * 设置抄送人
- *
- * @param copyto
- * String
- */
- public boolean setCopyTo(String copyto) {
- if (copyto == null)
- return false;
- try {
- mimeMsg.setRecipients(Message.RecipientType.CC, (Address[]) InternetAddress.parse(copyto));
- return true;
- }
- catch (Exception e) {
- return false;
- }
- }
- /**
- * 发送邮件
- */
- public boolean sendOut() {
- try {
- mimeMsg.setContent(mp);
- mimeMsg.saveChanges();
- logger.info("正在发送邮件....");
- Transport transport = session.getTransport("smtp");
- transport.connect((String) props.get("mail.smtp.host"), username, password);
- transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
- // transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.CC));
- // Transport.send(mimeMsg);
- logger.info("发送邮件成功!");
- transport.close();
- return true;
- }
- catch (Exception e) {
- logger.error("邮件发送失败!" + e);
- return false;
- }
- }
- /**
- * 调用sendOut方法完成邮件发送
- *
- * @param smtp
- * @param from
- * @param to
- * @param subject
- * @param content
- * @param username
- * @param password
- * @return boolean
- */
- public static boolean send(String smtp, String from, String to, String subject, String content, String username, String password) {
- MailSendUtil theMail = new MailSendUtil(smtp);
- theMail.setNeedAuth(true); // 需要验证
- if (!theMail.setSubject(subject))
- return false;
- if (!theMail.setBody(content))
- return false;
- if (!theMail.setTo(to))
- return false;
- if (!theMail.setFrom(from))
- return false;
- theMail.setNamePass(username, password);
- if (!theMail.sendOut())
- return false;
- return true;
- }
- /**
- * 调用sendOut方法完成邮件发送,带抄送
- *
- * @param smtp
- * @param from
- * @param to
- * @param copyto
- * @param subject
- * @param content
- * @param username
- * @param password
- * @return boolean
- */
- public static boolean sendAndCc(String smtp, String from, String to, String copyto, String subject, String content, String username, String password) {
- MailSendUtil theMail = new MailSendUtil(smtp);
- theMail.setNeedAuth(true); // 需要验证
- if (!theMail.setSubject(subject))
- return false;
- if (!theMail.setBody(content))
- return false;
- if (!theMail.setTo(to))
- return false;
- if (!theMail.setCopyTo(copyto))
- return false;
- if (!theMail.setFrom(from))
- return false;
- theMail.setNamePass(username, password);
- if (!theMail.sendOut())
- return false;
- return true;
- }
- /**
- * 调用sendOut方法完成邮件发送,带附件
- *
- * @param smtp
- * @param from
- * @param to
- * @param subject
- * @param content
- * @param username
- * @param password
- * @param filename
- * 附件路径
- * @return
- */
- public static boolean send(String smtp, String from, String to, String subject, String content, String username, String password, String filename) {
- MailSendUtil theMail = new MailSendUtil(smtp);
- theMail.setNeedAuth(true); // 需要验证
- logger.info("发送邮件至:{} " + to);
- if (!theMail.setSubject(subject))
- return false;
- if (!theMail.setBody(content))
- return false;
- if (!theMail.addFileAffix(filename))
- return false;
- if (!theMail.setTo(to))
- return false;
- if (!theMail.setFrom(from))
- return false;
- theMail.setNamePass(username, password);
- if (!theMail.sendOut())
- return false;
- return true;
- }
- /**
- * 调用sendOut方法完成邮件发送,带附件和抄送
- *
- * @param smtp
- * @param from
- * @param to
- * @param copyto
- * @param subject
- * @param content
- * @param username
- * @param password
- * @param filename
- * @return
- */
- public static boolean sendAndCc(String smtp, String from, String to, String copyto, String subject, String content, String username, String password, String filename) {
- MailSendUtil theMail = new MailSendUtil(smtp);
- theMail.setNeedAuth(true); // 需要验证
- if (!theMail.setSubject(subject))
- return false;
- if (!theMail.setBody(content))
- return false;
- if (!theMail.addFileAffix(filename))
- return false;
- if (!theMail.setTo(to))
- return false;
- if (!theMail.setCopyTo(copyto))
- return false;
- if (!theMail.setFrom(from))
- return false;
- theMail.setNamePass(username, password);
- if (!theMail.sendOut())
- return false;
- return true;
- }
- public static void main(String[] args) {
- String smtp = "10.75.210.10";
- String from = "test1@xxxxx";
- String to = "liuqiuyun@xxxx";
- String subject = "管理系统";
- String content = "邮件内容";
- String username = "test1";
- String password = "Password1";
- String filename = "D:\\file\\ces\\INT_MMS_SETTLE_20150211_0001.DATA";
- try {
- MailSendUtil.send(smtp, from, to, subject, content, username, password, filename);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
6、SFTP处理工具
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Vector;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import com.lz.lsf.exception.BusinessException;/*** * 功能概要:SFTP客户端* * @author linbingwen* @since 2015年8月5日*/
public class SftpClient {private String m_host = "127.0.0.1";private int m_port = 22;private String m_username = "ctsUser";private String m_password = "ctsUser";private Logger logger = LoggerFactory.getLogger(this.getClass());private Channel m_channel = null;public SftpClient(String host, int Port, String userName, String password) {this.m_host = host;this.m_port = Port;this.m_username = userName;this.m_password = password;}public void reConnect() {try {this.connect();}catch (Exception e) {logger.warn("m_channel disconnect fail!", e);}}public void connect() {JSch jsch = new JSch();try {jsch.getSession(m_username, m_host, m_port);Session sshSession = jsch.getSession(m_username, m_host, m_port);logger.info("username:" + m_username + ", host:" + m_host + ",port:" + m_port);java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");sshSession.setConfig(config);logger.debug("StrictHostKeyChecking", "no");sshSession.setPassword(m_password);sshSession.connect();logger.debug("Session connected.");m_channel = sshSession.openChannel("sftp");logger.debug("Opening Channel.");m_channel.connect();logger.info("Connected to {} success! ", m_host);}catch (JSchException e) {logger.error("connected to " + m_host + "Fail! ");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL, e, "connected to " + m_host + "Fail! ");}}public void disConnect() {try {if (m_channel == null)return;synchronized (m_channel) {if (m_channel.getSession().isConnected())m_channel.getSession().disconnect();}m_channel.disconnect();}catch (JSchException e) {logger.warn("m_channel disconnect fail!", e);}finally {if (m_channel != null)m_channel = null;}}public boolean isTryConnect() {int tryConnectCount = 0;try {while (true) {tryConnectCount++;if (m_channel.getSession().isConnected())return true;else {if (tryConnectCount >= 3)return false;else {this.reConnect();}}}}catch (JSchException e) {logger.warn("m_channel isConnected fail!", e);return false;}}/*** 上传文件* * @param directoryName* 上传的目录* @param uploadFileName* 要上传的文件* @param sftp* @throws SftpException* @throws FileNotFoundException* @throws JSchException*/public void upload(String remotePathDirName, String uploadFileName) {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL);}try {sftp.cd(remotePathDirName);File uploadFile = new File(uploadFileName);sftp.put(new FileInputStream(uploadFile), uploadFile.getName());logger.debug("Upload file:{} to remote dir:{}", uploadFileName, remotePathDirName);}catch (FileNotFoundException e) {logger.error("download remote path({})FileNotFound{}", remotePathDirName, uploadFileName);throw new BusinessException(CommonErrorCode.NOT_EXISTS_PATH_SFTP_REMOTE, e, "FileNotFound:" + uploadFileName);}catch (SftpException e) {logger.error("download remote path({}) not exists!{}", remotePathDirName, e);throw new BusinessException(CommonErrorCode.NOT_EXISTS_PATH_SFTP_REMOTE, e, "remote path:" + remotePathDirName);}}public void uploadBatch(String directoryName, List<String> fileNameList) {for (String fileName : fileNameList) {this.upload(directoryName, fileName);}}/*** 下载文件* * @param directoryName* 下载目录* @param downloadFileName* 下载的文件* @param saveFileName* 存在本地的路径* @param sftp* @throws SftpException* @throws FileNotFoundException* @throws JSchException*/public void download(String remotePathDirName, String localPathDirName, String downloadFileName) {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");// throw new BusinessException(ActErrorCode.ERROR_CONNECT_SFTP_FAIL);}try {sftp.cd(remotePathDirName);File saveFile = new File(localPathDirName + "//" + downloadFileName);sftp.get(downloadFileName, new FileOutputStream(saveFile));logger.debug("Download file:{} save as {}", downloadFileName, localPathDirName + "//" + downloadFileName);}catch (FileNotFoundException e) {e.printStackTrace();logger.error("download remote path{}//{}", remotePathDirName, downloadFileName);throw new BusinessException(CommonErrorCode.NOT_FINDFIELS_REMOTE_PATH, e, "FileNotFound:" + downloadFileName);}catch (SftpException e) {logger.error("download remote path({}) fail!{}", remotePathDirName + downloadFileName, e);throw new BusinessException(CommonErrorCode.NOT_EXISTS_PATH_SFTP_REMOTE, e, "remote path:" + remotePathDirName);}}public void downloadBatch(String directoryName, String localPathDirName, List<String> downloadFileNameList) {for (String fileName : downloadFileNameList) {this.download(directoryName, localPathDirName, fileName);}}public boolean isFileExists(String remotePathDirName) {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL);}try {Vector<LsEntry> filesName = sftp.ls(remotePathDirName);return filesName.size() > 0;}catch (SftpException e) {logger.warn("download remote path({}) not exists!{}", remotePathDirName, e);return false;}}/*** 删除文件* * @param directory* 要删除文件所在目录* @param deleteFileName* 要删除的文件* @param sftp* @throws SftpException* @throws JSchException*/public void delete(String directory, String deleteFileName) throws SftpException, JSchException {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL);}sftp.cd(directory);sftp.rm(deleteFileName);logger.info("Delete file:{} from remote dir:{}", deleteFileName, directory);}/*** 列出目录下的文件* * @param directoryName* 要列出的目录* @param sftp* @return* @throws SftpException* @throws JSchException*/@SuppressWarnings("unchecked")public Vector<LsEntry> listFiles(String directoryName) throws SftpException, JSchException {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL);}Vector<LsEntry> filesName = sftp.ls(directoryName);return filesName;}/*** 列出目录下符合要求的文件* * @param directoryName* 要列出的目录* @param reg* 文件名前缀* @param postfix* 文件名后缀(格式)* @return* @throws SftpException* @throws JSchException*/@SuppressWarnings("unchecked")public Vector<LsEntry> listFiles(String remotePathDirName, String reg, String postfix) {ChannelSftp sftp = (ChannelSftp) m_channel;if (!this.isTryConnect()) {logger.error("尝试连接SFTP服务器失败!");throw new BusinessException(CommonErrorCode.ERROR_CONNECT_SFTP_FAIL);}Vector<LsEntry> filesName;try {filesName = sftp.ls(remotePathDirName);Vector<LsEntry> filterFilesName = new Vector<LsEntry>();for (LsEntry lsEntry : filesName) {if (lsEntry.getFilename().indexOf(reg) > -1 && lsEntry.getFilename().endsWith(postfix)) {filterFilesName.add(lsEntry);}}return filterFilesName;}catch (SftpException e) {logger.error("download remote path({}) not exists!{}", remotePathDirName, e);throw new BusinessException(CommonErrorCode.NOT_EXISTS_PATH_SFTP_REMOTE, e, "remote path" + remotePathDirName);}}}
7、class工具
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.math.BigDecimal;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.Set;
- import org.apache.commons.beanutils.BeanUtils;
- import com.lz.lsf.util.StringUtil;
- public class ClassUtil {
- static Set<Class> privateTypes = new HashSet<Class>();
- static {
- privateTypes.add(int.class);
- privateTypes.add(double.class);
- privateTypes.add(long.class);
- privateTypes.add(float.class);
- privateTypes.add(boolean.class);
- privateTypes.add(Integer.class);
- privateTypes.add(Double.class);
- privateTypes.add(Long.class);
- privateTypes.add(Float.class);
- privateTypes.add(String.class);
- privateTypes.add(Date.class);
- privateTypes.add(Boolean.class);
- }
- public static Class<?> getFieldGenricType(Field field, int index) {
- String signature = field.toGenericString();
- return getGenericeType(signature, index);
- }
- private static Class<?> getGenericeType(String signature, int index) {
- String genericStr = signature.substring(signature.indexOf("<") + 1, signature.indexOf(">"));
- String[] types = genericStr.split(",");
- if (types.length > 0 && types.length > index) {
- try {
- return Class.forName(types[index]);
- }
- catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
- else {
- return null;
- }
- }
- /**
- * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
- *
- * @param clazz
- * clazz The class to introspect
- * @param index
- * the Index of the generic ddeclaration,start from 0.
- * @return the index generic declaration, or Object.class if cannot be determined
- */
- @SuppressWarnings("unchecked")
- public static Class<?> getSuperClassGenricType(final Class clazz, final int index) {
- Class<?> ret = null;
- // 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
- Type genType = clazz.getGenericSuperclass();
- ret = getGenericType(genType, index);
- if (ret == null) {
- for (Type t : clazz.getGenericInterfaces()) {
- ret = getGenericType(t, index);
- if (ret != null) {
- break;
- }
- }
- }
- return ret;
- }
- private static Class<?> getGenericType(Type type, int index) {
- if (!(type instanceof ParameterizedType)) {
- return null;
- }
- // 返回表示此类型实际类型参数的 Type 对象的数组。
- Type[] params = ((ParameterizedType) type).getActualTypeArguments();
- if (index >= params.length || index < 0) {
- return null;
- }
- if (!(params[index] instanceof Class)) {
- return null;
- }
- return (Class) params[index];
- }
- public static String getSetterMethod(String attrName) {
- String fst = attrName.substring(0, 1).toUpperCase();
- attrName = fst + attrName.substring(1);
- return "set" + attrName;
- }
- public static void setObjectValue(Object obj, String fieldName, Object value) {
- try {
- String methodName = getSetterMethod(fieldName);
- Method method = findMethod(obj.getClass(), methodName, String.class);
- if (method != null) {
- method.invoke(obj, value);
- }
- else {
- Field field = obj.getClass().getDeclaredField(fieldName);
- if (field != null) {
- field.setAccessible(true);
- field.set(obj, value);
- }
- else {
- throw new RuntimeException("no field or set method found for field:" + fieldName);
- }
- }
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- public static boolean isPriovateType(Class type) {
- return privateTypes.contains(type);
- }
- public static Object getPrivateTypeValue(Class type, String value) {
- if (String.class == type) {
- return value;
- }
- else if (int.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Integer.parseInt(value);
- }
- else if (double.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Double.parseDouble(value);
- }
- else if (long.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Long.parseLong(value);
- }
- else if (float.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Float.parseFloat(value);
- }
- else if (Integer.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Integer.valueOf(value);
- }
- else if (Double.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Double.valueOf(value);
- }
- else if (Long.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Long.valueOf(value);
- }
- else if (Float.class == type) {
- return StringUtil.isEmpty(value) ? 0 : Float.valueOf(value);
- }
- else if (BigDecimal.class == type) {
- return StringUtil.isEmpty(value) ? BigDecimal.ZERO : BigDecimal.valueOf(Double.valueOf(value));
- }
- else if (boolean.class == type || Boolean.class == type) {
- return StringUtil.isEmpty(value) ? false : Boolean.valueOf(value);
- }
- else {
- return null;
- }
- }
- public static void main(String[] args) {
- System.out.println( Boolean.valueOf("true"));
- System.out.println( Boolean.valueOf("false"));
- String[] sp = "|1|2|||| ".split("\\|");
- System.out.println(sp);
- System.out.println("|1|2||||".endsWith("|"));
- }
- public static Method findMethod(Class<?> clazz, String methodName, Class<?> paramType) {
- Method ret = null;
- try {
- ret = clazz.getMethod(methodName, paramType);
- }
- catch (Exception e) {
- if (paramType.getSuperclass() != null) {
- ret = findMethod(clazz, methodName, paramType.getSuperclass());
- }
- if (ret == null) {
- for (Class _clazz : paramType.getInterfaces()) {
- ret = findMethod(clazz, methodName, _clazz);
- if (ret != null) {
- break;
- }
- }
- }
- }
- return ret;
- }
- @SuppressWarnings("unchecked")
- public static <T> T cloneInstance(T obj) {
- T ret;
- try {
- ret = (T) BeanUtils.cloneBean(obj);
- }
- catch (Exception e) {
- throw new RuntimeException("clone instance failed!", e);
- }
- return ret;
- }
- }
8、GET/POST请求工具
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.lang3.StringUtils;
- import org.apache.http.Consts;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.CookieStore;
- import org.apache.http.client.config.RequestConfig;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.BasicCookieStore;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClients;
- import org.apache.http.impl.cookie.BasicClientCookie;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.util.EntityUtils;
- import org.junit.Test;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class HttpClientUtil {
- static CookieStore cookieStore = null;
- private static Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
- public static void main(String[] args) {
- Map<String, String> map = new HashMap<String, String>();
- map.put("pageIndex", "1");
- map.put("pageSize", "20");
- String result = HttpClientUtil.post("http://xxxxx/xxx/operator/menu/findByPage.json", map);
- logger.info("post result:" + result);
- map = new HashMap<String, String>();
- map.put("pageNumber", "1");
- map.put("pageSize", "20");
- result = HttpClientUtil.get("http://xxx/ftc-ump-mid/xxx/dict/condition.json", map);
- logger.info("get result:" + result);
- }
- @Test
- public void postTest() {
- Map<String, String> map = new HashMap<String, String>();
- map.put("pageIndex", "1");
- map.put("pageSize", "20");
- String result = HttpClientUtil.post("http:/xxxxx/findByPage.json", map);
- logger.info("result:" + result);
- }
- @Test
- public void getTest() {
- Map<String, String> map = new HashMap<String, String>();
- map.put("pageNumber", "1");
- map.put("pageSize", "20");
- String result = HttpClientUtil.get("http://xxxxor/dict/condition.json", map);
- logger.info("result:" + result);
- }
- /**
- * 获取cookie的内容
- *
- * @param ck
- * @param name
- * @return
- */
- public static String retriveCkValue(String ck, String name) {
- if (StringUtils.isBlank(ck) || StringUtils.isBlank(name)) {
- return "";
- }
- final String delimChar = name + "=";
- int delimBegin = ck.indexOf(delimChar);
- if (delimBegin < 0) {
- return "";
- }
- String val = null;
- int delimEnd = ck.indexOf(';', delimBegin);
- if (delimEnd < 0) {
- val = ck.substring(delimBegin + delimChar.length()).trim();
- } else {
- val = ck.substring(delimBegin + delimChar.length(), delimEnd).trim();
- }
- int idx = val.indexOf('?');
- if (idx > 0) {
- val = val.substring(0, idx);
- }
- return val;
- }
- /**
- * 将cookie保存到静态变量中供后续调用
- *
- * @param httpResponse
- */
- public static void setCookieStore(HttpResponse httpResponse) {
- logger.info("-------setCookieStore---------");
- if (httpResponse.getFirstHeader("Set-Cookie") != null) {
- cookieStore = new BasicCookieStore();
- org.apache.http.Header[] cookies = httpResponse.getHeaders("Set-Cookie");
- // Expires=Fri, 14-Apr-2017 09:42:26 GMT;
- for (int j = 0; j < cookies.length; j++) {
- String content = cookies[j].getValue();
- String cookName = content.substring(0, content.indexOf("="));
- String cookNameContent = retriveCkValue(content, cookName);
- String domain = retriveCkValue(content, "Domain");
- String path = retriveCkValue(content, "Path");
- String time = retriveCkValue(content, "Expires");
- Date expires = new Date(time);
- BasicClientCookie cookie = new BasicClientCookie(cookName, cookNameContent);
- cookie.setDomain(domain);
- cookie.setPath(path);
- cookie.setExpiryDate(expires);
- cookieStore.addCookie(cookie);
- logger.info(cookName + ":{},domain:{},path:{},expires", cookNameContent, domain, path, expires);
- }
- }
- }
- /**
- * 模拟登陆
- *
- * @param client
- * @return
- */
- private static String login(CloseableHttpClient client) {
- String path = "http://xxxxxx/operator.json";
- Map<String, String> params = new HashMap<String, String>();
- params.put("userId", "ITADMIN2");
- params.put("password", "123456");
- List<NameValuePair> list = new ArrayList<NameValuePair>();
- if (params != null && !params.isEmpty()) {
- for (Map.Entry<String, String> entry : params.entrySet()) {
- list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- HttpResponse httpResponse = null;
- try {
- // 实现将请求的参数封装到表单中,即请求体中
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, Consts.UTF_8);
- // 使用post方式提交数据
- HttpPost httpPost = new HttpPost(path);
- int connectionTimeout = 15000;
- int soTimeout = 15000;
- RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectionTimeout).setSocketTimeout(soTimeout).build();
- httpPost.setConfig(requestConfig);
- httpPost.setEntity(entity);
- httpResponse = client.execute(httpPost);
- // 获取服务器端返回的状态码和输入流,将输入流转换成字符串
- if (httpResponse.getStatusLine().getStatusCode() == 200) {
- // setCookieStore(httpResponse); // 设置cookie
- return EntityUtils.toString(httpResponse.getEntity(), Consts.UTF_8);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (httpResponse != null) {
- try {
- EntityUtils.consume(httpResponse.getEntity());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- return "";
- }
- /**
- * 模拟get
- *
- * @param path
- * @param params
- * @param encode
- * @return
- */
- public static String get(String path, Map<String, String> params) {
- List<NameValuePair> list = new ArrayList<NameValuePair>();
- if (params != null && !params.isEmpty()) {
- for (Map.Entry<String, String> entry : params.entrySet()) {
- list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- HttpResponse httpResponse = null;
- CloseableHttpClient client = null;
- try {
- // 实现将请求的参数封装到表单中,即请求体中
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, Consts.UTF_8);
- // 转换为键值对
- String str = EntityUtils.toString(entity);
- // 使用get方式提交数据
- HttpGet httpGet = new HttpGet(path + "?" + str);
- int connectionTimeout = 15000;
- int soTimeout = 15000;
- RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectionTimeout).setSocketTimeout(soTimeout).build();
- httpGet.setConfig(requestConfig);
- // 执行get请求,并获取服务器端的响应HttpResponse
- client = HttpClients.createDefault();
- // if (cookieStore != null) {
- // client =
- // HttpClients.custom().setDefaultCookieStore(cookieStore).build();
- // } else {
- // client = HttpClients.createDefault();
- // login(client);
- // }
- login(client);
- httpResponse = client.execute(httpGet);
- // 获取服务器端返回的状态码和输入流,将输入流转换成字符串
- if (httpResponse.getStatusLine().getStatusCode() == 200) {
- return EntityUtils.toString(httpResponse.getEntity(), Consts.UTF_8);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (httpResponse != null) {
- try {
- EntityUtils.consume(httpResponse.getEntity());
- } catch (IOException e) {
- logger.error("", e);
- }
- }
- if (client != null) {
- try {
- client.close();
- } catch (IOException e) {
- logger.error("", e);
- }
- }
- }
- return "";
- }
- /**
- * 模拟post
- *
- * @param path
- * @param params
- * @param encode
- * @return
- */
- public static String post(String path, Map<String, String> params) {
- List<NameValuePair> list = new ArrayList<NameValuePair>();
- if (params != null && !params.isEmpty()) {
- for (Map.Entry<String, String> entry : params.entrySet()) {
- list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
- }
- }
- HttpResponse httpResponse = null;
- CloseableHttpClient client = null;
- try {
- // 实现将请求的参数封装到表单中,即请求体中
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "utf-8");
- // 使用post方式提交数据
- HttpPost httpPost = new HttpPost(path);
- int connectionTimeout = 15000;
- int soTimeout = 15000;
- RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectionTimeout).setSocketTimeout(soTimeout).build();
- httpPost.setConfig(requestConfig);
- httpPost.setEntity(entity);
- // 执行post请求,并获取服务器端的响应HttpResponse
- HttpClients.createDefault();
- login(client);
- // if (cookieStore != null) {
- // client =
- // HttpClients.custom().setDefaultCookieStore(cookieStore).build();
- // } else {
- // client = HttpClients.createDefault();
- // login(client);
- // }
- httpResponse = client.execute(httpPost);
- // 获取服务器端返回的状态码和输入流,将输入流转换成字符串
- if (httpResponse.getStatusLine().getStatusCode() == 200) {
- return EntityUtils.toString(httpResponse.getEntity(), "utf-8");
- }
- } catch (Exception e) {
- logger.error("", e);
- } finally {
- if (httpResponse != null) {
- try {
- EntityUtils.consume(httpResponse.getEntity());
- } catch (IOException e) {
- logger.error("", e);
- }
- }
- if (client != null) {
- try {
- client.close();
- } catch (IOException e) {
- logger.error("", e);
- }
- }
- }
- return "";
- }
- }
9、ES处理工具
- import com.alibaba.fastjson.JSONObject;
- import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
- import org.elasticsearch.action.bulk.BulkRequestBuilder;
- import org.elasticsearch.action.bulk.BulkResponse;
- import org.elasticsearch.action.count.CountRequestBuilder;
- import org.elasticsearch.action.count.CountResponse;
- import org.elasticsearch.action.delete.DeleteRequestBuilder;
- import org.elasticsearch.action.delete.DeleteResponse;
- import org.elasticsearch.action.get.GetResponse;
- import org.elasticsearch.action.index.IndexRequest;
- import org.elasticsearch.action.index.IndexRequestBuilder;
- import org.elasticsearch.action.index.IndexResponse;
- import org.elasticsearch.action.search.SearchRequestBuilder;
- import org.elasticsearch.action.search.SearchResponse;
- import org.elasticsearch.action.search.SearchType;
- import org.elasticsearch.action.update.UpdateRequest;
- import org.elasticsearch.action.update.UpdateResponse;
- import org.elasticsearch.client.Requests;
- import org.elasticsearch.client.transport.TransportClient;
- import org.elasticsearch.common.lang3.StringUtils;
- import org.elasticsearch.common.settings.ImmutableSettings;
- import org.elasticsearch.common.settings.Settings;
- import org.elasticsearch.common.transport.InetSocketTransportAddress;
- import org.elasticsearch.common.xcontent.XContentBuilder;
- import org.elasticsearch.index.query.FilterBuilder;
- import org.elasticsearch.index.query.QueryBuilder;
- import org.elasticsearch.search.SearchHit;
- import org.elasticsearch.search.SearchHits;
- import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class ESClient {
- private static final Logger log = LoggerFactory.getLogger(ESClient.class);
- private TransportClient client;
- public ESClient() {
- this.init();
- }
- private void close() {
- if (this.client != null) {
- this.client.close();
- }
- }
- @Override
- public void finalize() throws Throwable {
- this.close();
- super.finalize();
- }
- private void init() {
- try {
- Settings settings = ImmutableSettings.settingsBuilder().loadFromClasspath("elasticsearch.yml")
- .put("client.transport.sniff", true).build();
- this.client = new TransportClient(settings);
- int port = settings.getAsInt("client.transport.port", 9900);
- String[] ips = settings.getAsArray("client.transport.ip");
- for (String ip : ips) {
- log.info("the ip is:" + ip);
- client.addTransportAddress(new InetSocketTransportAddress(ip, port));
- }
- log.info("es连接成功:{},{}", client, JSONObject.toJSONString(client.listedNodes()));
- } catch (Exception e) {
- if (client != null) {
- client.close();
- }
- log.error("连接es失败!", e);
- }
- }
- public void createIndex(String index) throws Exception {
- client.admin().indices().prepareCreate(index).execute().actionGet();
- }
- /**
- * 为一种类型建立mapping
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param builder mapping内容, 格式 { "properties": { "fieldName1": { "type":
- * "string", "analyzer": "ik" }, "fieldName2": { "type":
- * "string", "index": "not_analyzed" } } }
- */
- public void mappingDoc(String index, String type, XContentBuilder builder)
- throws Exception {
- // XContentBuilder builder = XContentFactory.jsonBuilder()
- // .startObject()
- // .startObject("properties")
- // .startObject("province")
- // .field("type", "string")
- // //.field("store", "yes")
- // .field("analyzer","ik")
- // .field("index","analyzed")
- // //.field("indexAnalyzer", "ik")
- // //.field("searchAnalyzer", "ik")
- // .endObject()
- // .endObject()
- // .endObject();
- PutMappingRequest mapping = Requests.putMappingRequest(index)
- .type(type).source(builder);
- client.admin().indices().putMapping(mapping).actionGet();
- }
- /**
- * 为一份文档建立索引,采用自生成id
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param json json格式的数据集
- * @return
- */
- public IndexResponse indexDoc(String index, String type, String json) throws Exception {
- IndexRequestBuilder builder = client.prepareIndex(index, type);
- IndexResponse response = builder.setSource(json)
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为一份文档建立索引,采用自生成id
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param kvMap 键值对形式的数据集
- * @return
- */
- public IndexResponse indexDoc(String index, String type, Map<String, Object> kvMap)
- throws Exception {
- IndexRequestBuilder builder = client.prepareIndex(index, type);
- IndexResponse response = builder.setSource(kvMap)
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为一份文档建立索引
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param id 文档id
- * @param json json格式的数据集
- * @return
- */
- public IndexResponse indexDoc(String index, String type, String id, String json)
- throws Exception {
- IndexRequestBuilder builder = client.prepareIndex(index, type, id);
- IndexResponse response = builder.setSource(json)
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为一份文档建立索引
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param id 文档id
- * @param kvMap 键值对形式的数据集
- * @return
- */
- public IndexResponse indexDoc(String index, String type, String id, Map<String, Object> kvMap)
- throws Exception {
- IndexRequestBuilder builder = client.prepareIndex(index, type, id);
- IndexResponse response = builder.setSource(kvMap)
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为多份文档建立索引,采用自生成id
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param jsonList json格式的文档数据: List<json>
- * @return
- */
- public BulkResponse batchIndexDocsForJson(String index, String type, List<String> jsonList)
- throws Exception {
- if (jsonList.isEmpty()) {
- throw new Exception("批量创建索引时,传入的参数'jsonList'为空!");
- }
- List<IndexRequest> requestList = new ArrayList<IndexRequest>(jsonList.size());
- for (String json : jsonList) {
- IndexRequest request = client.prepareIndex(index, type)
- .setSource(json)
- .request();
- requestList.add(request);
- }
- BulkRequestBuilder bulkRequest = client.prepareBulk();
- for (IndexRequest request : requestList) {
- bulkRequest.add(request);
- }
- BulkResponse response = bulkRequest
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为多份文档建立索引,采用自生成id
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param kvList 键值对形式的文档数据:List<Map<field, value>>
- * @return
- */
- public BulkResponse batchIndexDocsForMap(String index, String type, List<Map<String, Object>> kvList)
- throws Exception {
- if (kvList.isEmpty()) {
- throw new Exception("批量创建索引时,传入的参数'kvList'为空!");
- }
- List<String> jsonList = new ArrayList<String>(kvList.size());
- for (Map<String, Object> kvMap : kvList) {
- jsonList.add(JSONObject.toJSONString(kvMap));
- }
- BulkResponse response = this.batchIndexDocsForJson(index, type, jsonList);
- jsonList.clear();
- return response;
- }
- /**
- * 为多份文档建立索引
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param idJsonMap id及json格式的文档数据: Map<id,json>
- * @return
- */
- public BulkResponse batchIndexDocsForJson(String index, String type, Map<String, String> idJsonMap)
- throws Exception {
- if (idJsonMap.isEmpty()) {
- throw new Exception("批量创建索引时,传入的参数'idJsonMap'为空!");
- }
- List<IndexRequest> requestList = new ArrayList<IndexRequest>(idJsonMap.size());
- for (String id : idJsonMap.keySet()) {
- String json = idJsonMap.get(id);
- IndexRequest request = client.prepareIndex(index, type, id)
- .setSource(json)
- .request();
- requestList.add(request);
- }
- BulkRequestBuilder bulkRequest = client.prepareBulk();
- for (IndexRequest request : requestList) {
- bulkRequest.add(request);
- }
- BulkResponse response = bulkRequest
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 为多份文档建立索引
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param idKvMap id及键值对形式的文档数据:Map<id,Map<field, value>>
- * @return
- */
- public BulkResponse batchIndexDocsForMap(String index, String type, Map<String, Map<String, Object>> idKvMap)
- throws Exception {
- if (idKvMap.isEmpty()) {
- throw new Exception("批量创建索引时,传入的参数'idKvMap'为空!");
- }
- Map<String, String> idJsonMap = new HashMap<String, String>(idKvMap.size());
- for (String id : idKvMap.keySet()) {
- Map<String, Object> kvMap = idKvMap.get(id);
- idJsonMap.put(id, JSONObject.toJSONString(kvMap));
- }
- BulkResponse response = this.batchIndexDocsForJson(index, type, idJsonMap);
- idJsonMap.clear();
- return response;
- }
- /**
- * 更新一个doc, 若不存在则插入
- *
- * @param index
- * @param type
- * @param id
- * @param json
- * @param script
- * @throws java.util.concurrent.ExecutionException
- * @throws InterruptedException
- */
- // public UpdateResponse upsertDoc(String index, String type, String id, String json, String script) throws Exception {
- // IndexRequest indexRequest = new IndexRequest(index, type, id).source(json);
- // UpdateRequest updateRequest = new UpdateRequest(index, type, id);
- // //updateRequest.doc();
- // updateRequest.upsert(indexRequest);
- // updateRequest.script(script);
- //
- // UpdateResponse response = client.update(updateRequest).get();
- //
- // return response;
- // }
- public UpdateResponse upsertDoc(String index, String type, String id, String insertJson, String updateJson) throws Exception {
- IndexRequest indexRequest = new IndexRequest(index, type, id).source(insertJson);
- UpdateRequest updateRequest = new UpdateRequest(index, type, id);
- updateRequest.doc(updateJson);
- updateRequest.upsert(indexRequest);
- UpdateResponse response = client.update(updateRequest).get();
- return response;
- }
- /**
- * 根据条件 统计个数
- *
- * @param queryBuilder 查詢條件
- * @param index 索引库名 相當於 数据库名
- * @param type 索引类型 相當於 表名
- * @return
- */
- public long countQuery(String index, String type, QueryBuilder queryBuilder) {
- CountRequestBuilder crb = client.prepareCount(index).setTypes(type);
- if (queryBuilder != null) {
- crb.setQuery(queryBuilder);
- }
- CountResponse response = crb.execute().actionGet();
- return response.getCount();
- }
- public SearchResponse searchAgg(String index, String type, String searchType, QueryBuilder queryBuilder,
- AbstractAggregationBuilder aggBuilder) {
- SearchRequestBuilder builder = client.prepareSearch(index).setTypes(type);
- if (!StringUtils.isEmpty(searchType)) {
- builder.setSearchType(SearchType.valueOf(searchType));
- }
- if (queryBuilder != null) {
- builder = builder.setQuery(queryBuilder);
- }
- if (aggBuilder != null) {
- builder = builder.addAggregation(aggBuilder);
- }
- SearchResponse searchResponse = builder.execute().actionGet();
- return searchResponse;
- }
- /**
- * 删除一个文档
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param id 键值对形式的数据集
- * @return
- */
- public DeleteResponse deleteDoc(String index, String type, String id) throws InterruptedException {
- DeleteRequestBuilder builder = client.prepareDelete(index, type, id);
- DeleteResponse response = builder
- .execute()
- .actionGet();
- return response;
- }
- /**
- * 根据条件删除多个文档
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param queryBuilder 查询器
- * @return
- */
- public void deleteDocsByQuery(String index, String type, QueryBuilder queryBuilder) {
- client.prepareDeleteByQuery(index).setTypes(type).setQuery(queryBuilder)
- .execute()
- .actionGet();
- }
- /**
- * 指定id获取文档
- *
- * @param index 索引名,相当于关系型数据库的库名
- * @param type 文档类型,相当于关系型数据库的表名
- * @param id 文档id
- * @return
- */
- public Map<String, Object> getDoc(String index, String type, String id) {
- GetResponse response = client.prepareGet(index, type, id)
- .execute()
- .actionGet();
- Map<String, Object> retMap = response.getSourceAsMap();
- return retMap;
- }
- public List<Map<String, Object>> search(String index, String type, QueryBuilder queryBuilder, FilterBuilder filterBuilder) {
- SearchRequestBuilder builder = client.prepareSearch(index).setTypes(type);
- if (queryBuilder != null) {
- builder = builder.setQuery(queryBuilder);
- }
- if (filterBuilder != null) {
- builder = builder.setPostFilter(filterBuilder);
- }
- SearchResponse searchResponse = builder.execute().actionGet();
- SearchHits hits = searchResponse.getHits();
- log.info("Es Hits count: " + hits.getTotalHits());
- List<Map<String, Object>> kvList = new ArrayList<Map<String, Object>>();
- SearchHit[] hitArray = hits.getHits();
- if (hitArray.length > 0) {
- for (SearchHit hit : hitArray) {
- Map<String, Object> kvMap = hit.getSource();
- kvMap.put("version", hit.getVersion());
- kvMap.put("_id", hit.getId());
- kvList.add(kvMap);
- }
- }
- return kvList;
- }
- }
10、Hbase处理工具
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 操作Hbase的常用方法* <p/>* Created by huqingmiao on 2015/4/14.*/
public class HbaseUtil {private static final Logger log = LoggerFactory.getLogger(HbaseUtil.class);private static Configuration conf = null;private static HConnection conn = null;private static String HADOOP_HOME = "C:/hadoop";static {// try {
// String hadoopHome = System.getProperties().getProperty("hadoop.home.dir"); //Windows下的HOME目录, 在unix下部署不需要设置
// if (hadoopHome == null || "".equals(hadoopHome.trim())) {
// hadoopHome = HADOOP_HOME;
// }
//
// File hadoopBinDir = new File(hadoopHome, "bin"); //HOME目录下的bin目录
// if (!hadoopBinDir.exists()) {
// hadoopBinDir.mkdirs();
// }
// File winExeFile = new File(hadoopBinDir.getCanonicalPath() + File.separator + "winutils.exe");
// if (!winExeFile.exists()) {
// winExeFile.createNewFile();
// }
//
// //设置环境变量
// System.getProperties().put("hadoop.home.dir", hadoopHome);
//
// } catch (IOException e) {
// log.error("create ./bin/winutils.exe error.", e);
// }//默认从hbase-site.xml读取配置信息conf = HBaseConfiguration.create();
// conf.set("hbase.zookeeper.property.clientPort", "2181");
// conf.set("hbase.zookeeper.quorum", "10.75.201.125");
// conf.set("hbase.master", "10.75.201.125:60010");//conf.set("hbase.zookeeper.quorum", "hmaster");//与hbase/conf/hbase-site.xml中hbase.zookeeper.property.clientPort配置的值相同// conf.set("hbase.zookeeper.property.clientPort", "2181");}public HbaseUtil() {try {//预先创建了一个连接,以后的访问都共享该连接//conf.addResource("hbase-site.xml");conn = HConnectionManager.createConnection(conf);} catch (Exception e) {log.error(e.getMessage(), e);}}@Overridepublic void finalize() throws Throwable {try {if (conn != null && !conn.isClosed()) {conn.close();}} catch (Exception e) {log.error(e.getMessage(), e);}super.finalize();}/*** 建表** @param tableName 表名* @param columnFamilys 列簇名* @throws Exception*/public void createTable(String tableName, String[] columnFamilys) throws Exception {HBaseAdmin hAdmin = null;try {hAdmin = new HBaseAdmin(conf);if (hAdmin.tableExists(tableName)) {log.info("已经存在要创建的表:" + tableName);} else {HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));//描述列族for (String columnFamily : columnFamilys) {tableDesc.addFamily(new HColumnDescriptor(columnFamily));}//建表hAdmin.createTable(tableDesc);log.info("成功创建表:" + tableName);}} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (hAdmin != null) {hAdmin.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 删除表** @param tableName 表名* @throws Exception*/public void deleteTable(String tableName) throws Exception {HBaseAdmin hAdmin = null;try {hAdmin = new HBaseAdmin(conf);if (hAdmin.tableExists(tableName)) {hAdmin.disableTable(tableName);//禁用表hAdmin.deleteTable(tableName);// 删除表log.info("成功删除表:" + tableName);} else {log.info("要删除的表不存在:" + tableName);}} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (hAdmin != null) {hAdmin.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 向指定的行、列簇、列写入一项数据;如果该行不存在,则会插入一行。** @param tableName 表名* @param rowkey 行键* @param colFamily 列簇名* @param column 列名* @param value 列值* @throws Exception*/public void putData(String tableName, String rowkey,String colFamily, String column, String value) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Put put = new Put(Bytes.toBytes(rowkey));// 参数分别为:列族、列、值put.add(Bytes.toBytes(colFamily), Bytes.toBytes(column), Bytes.toBytes(value));table.put(put);log.info("成功写入1项数据到{}.", tableName);} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 向指定的行、列簇、列写入一项数据;如果该行不存在,则会插入一行。** @param tableName 表名* @param hbCell 存放行键、列簇、列名、列值的数据单元* @throws Exception*/public void putData(String tableName, HbaseCell hbCell) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Put put = new Put(convertToBytes(hbCell.getRowkey()));// 参数分别为:列族、列、值put.add(Bytes.toBytes(hbCell.getColFamily()), Bytes.toBytes(hbCell.getColName()), convertToBytes(hbCell.getColValue()));table.put(put);log.info("成功写入1项数据到{}.", tableName);} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 写入多行、多列数据** @param tableName 表名* @param hbCellList 存放行键、列簇、列名、列值的数据单元.* @throws Exception*/public void putData(String tableName, List<HbaseCell> hbCellList) throws Exception {if (hbCellList.isEmpty()) {return;}HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);List<Put> putList = new ArrayList<Put>();for (HbaseCell hbCell : hbCellList) {Put put = new Put(convertToBytes(hbCell.getRowkey()));put.add(Bytes.toBytes(hbCell.getColFamily()), Bytes.toBytes(hbCell.getColName()), convertToBytes(hbCell.getColValue()));putList.add(put);}table.put(putList);log.info("成功写入{}项数据到{}.", hbCellList.size(), tableName);} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 写入多行、多列数据** @param tableName 表名* @param hbCellList 存放行键、列簇、列名、列值的数据单元.* @throws Exception*/public void putDataForNotNull(String tableName, List<HbaseCell> hbCellList) throws Exception {if (hbCellList.isEmpty()) {return;}HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);List<Put> putList = new ArrayList<Put>();for (HbaseCell hbCell : hbCellList) {if (!StringUtils.isEmpty(hbCell.getColValue() + "")) {Put put = new Put(convertToBytes(hbCell.getRowkey()));put.add(Bytes.toBytes(hbCell.getColFamily()), Bytes.toBytes(hbCell.getColName()), convertToBytes(hbCell.getColValue()));putList.add(put);}}table.put(putList);log.info("成功写入{}项数据到{}.", hbCellList.size(), tableName);} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 删除一行** @param tableName 表名* @param rowkey 行键* @throws Exception*/public void delRow(String tableName, String rowkey) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Delete del = new Delete(Bytes.toBytes(rowkey));table.delete(del);log.info("成功删除1行数据!");} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 删除多行** @param tableName 表名* @param rowkeys 行键* @throws Exception*/public void delMulitRows(String tableName, List<String> rowkeys) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);List<Delete> delList = new ArrayList<Delete>();for (String rowkey : rowkeys) {Delete del = new Delete(Bytes.toBytes(rowkey));delList.add(del);}table.delete(delList);delList.clear();log.info("成功删除{}行数据.", delList.size());} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 获取指定行的所有数据项** @param tableName 表名* @param rowkey 行键* @return* @throws Exception*/public Result getRow(String tableName, String rowkey) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Get get = new Get(Bytes.toBytes(rowkey));Result rs = table.get(get);// for (Cell cell : result.rawCells()) {
// System.out.print("Row Name: " + new String(CellUtil.cloneRow(cell)) + " ");
// System.out.print("Timestamp: " + cell.getTimestamp() + " ");
// System.out.print("column Family: " + new String(CellUtil.cloneFamily(cell)) + " ");
// System.out.print("column Name: " + new String(CellUtil.cloneQualifier(cell)) + " ");
// System.out.println("Value: " + new String(CellUtil.cloneValue(cell)) + " ");
// }return rs;} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 获取指定表的所有行的数据项** @param tableName 表名* @return* @throws Exception*/public List<Result> findAllRows(String tableName) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Scan scan = new Scan();ResultScanner results = table.getScanner(scan);List<Result> rsList = new ArrayList<Result>();for (Result rs : results) {rsList.add(rs);}return rsList;} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 通用查询** @param tableName 表名* @param filter 查询过滤器。单一条件查询可传Filter对象,组合条件查询可传FilterList, FilterList是Filter的子类。*/public List<Result> findRow(String tableName, Filter filter) throws Exception {HTableInterface table = null;try {//table = new HTable(conf, tableName);table = conn.getTable(tableName);Scan scan = new Scan();scan.setFilter(filter);ResultScanner results = table.getScanner(scan);List<Result> rsList = new ArrayList<Result>();for (Result rs : results) {rsList.add(rs);}return rsList;} catch (IOException e) {log.error(e.getMessage(), e);throw e;} finally {try {if (table != null) {table.close();}} catch (IOException e) {log.error(e.getMessage(), e);}}}/*** 打印、展示查询结果** @param result*/public void showData(Result result) {for (Cell cell : result.rawCells()) {log.info("Row: " + new String(CellUtil.cloneRow(cell)) + " ");log.info("Timestamp: " + cell.getTimestamp() + " ");log.info("Column Family: " + new String(CellUtil.cloneFamily(cell)) + " ");log.info("Column Name: " + new String(CellUtil.cloneQualifier(cell)) + " ");log.info("Column Value: " + new String(CellUtil.cloneValue(cell)) + " ");}}/*** 打印、展示查询的各项列值** @param rsList*/public void showData(List<Result> rsList) {log.info(">>>总的数据条数:" + rsList.size());if (rsList.isEmpty()) {return;}for (Result rs : rsList) {Cell[] cells = rs.rawCells();for (Cell cell : rs.rawCells()) {log.info("Row: " + new String(CellUtil.cloneRow(cell)) + " ");log.info("Timestamp: " + cell.getTimestamp() + " ");log.info("Column Family: " + new String(CellUtil.cloneFamily(cell)) + " ");log.info("Column Name: " + new String(CellUtil.cloneQualifier(cell)) + " ");log.info("Column Value: " + new String(CellUtil.cloneValue(cell)) + " ");}}}/*** 打印、展示查询的各项列值** @param rsList*/public void showRowkey(List<Result> rsList) {log.info(">>>总的数据条数:" + rsList.size());if (rsList.isEmpty()) {return;}for (Result rs : rsList) {log.info(new String(rs.getRow()));}}private byte[] convertToBytes(Object obj) throws Exception {if (obj == null) {return new byte[0];}if (obj instanceof String) {return Bytes.toBytes((String) obj);}if (obj instanceof Double) {return Bytes.toBytes((Double) obj);}if (obj instanceof Float) {return Bytes.toBytes((Float) obj);}if (obj instanceof Long) {return Bytes.toBytes((Long) obj);}if (obj instanceof Integer) {return Bytes.toBytes((Integer) obj);}if (obj instanceof Date) {return Bytes.toBytes(((Date) obj).getTime());}if (obj instanceof Timestamp) {return Bytes.toBytes(((Timestamp) obj).getTime());}if (obj instanceof BigDecimal) {return Bytes.toBytes((BigDecimal) obj);}throw new Exception("未能识别的数据类型: " + obj.getClass().getName());}// mainpublic static void main(String[] args) {try {HbaseUtil client = new HbaseUtil();String tableName = "testtable";// 创建数据库表:“studyinfo”String[] colFamilys = {"studyinfo", "course"};client.createTable(tableName, colFamilys);// 添加第一行数据client.putData(tableName, "ligan", "studyinfo", "age", "2333");client.putData(tableName, "ligan", "studyinfo", "sex", "boy");client.putData(tableName, "ligan", "course", "china", "97");client.putData(tableName, "ligan", "course", "math", "128");client.putData(tableName, "ligan", "course", "english", "85");// 添加第二行数据client.putData(tableName, "xiaoxue", "studyinfo", "age", "20");client.putData(tableName, "xiaoxue", "studyinfo", "sex", "boy");client.putData(tableName, "xiaoxue", "course", "china", "90");client.putData(tableName, "xiaoxue", "course", "math", "100");client.putData(tableName, "xiaoxue", "course", "english", "90");// 添加第三行数据,也可以这样写:HbaseCell hbCell1 = new HbaseCell("walker", "studyinfo", "age", "18");HbaseCell hbCell2 = new HbaseCell("walker", "studyinfo", "sex", "girl");HbaseCell hbCell3 = new HbaseCell("walker", "course", "math", "100");HbaseCell hbCell4 = new HbaseCell("walker", "course", "english", "30");List<HbaseCell> cellList = new ArrayList<HbaseCell>();cellList.add(hbCell1);cellList.add(hbCell2);cellList.add(hbCell3);cellList.add(hbCell4);client.putData(tableName, cellList);// 获取一条数据log.info("获取一条数据");Result rs = client.getRow(tableName, "ligan");client.showData(rs);//组合查询log.info("组合查询");List<Filter> filters = new ArrayList<Filter>();Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes("studyinfo"), Bytes.toBytes("age"), CompareFilter.CompareOp.GREATER, Bytes.toBytes("18"));filters.add(filter1);Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes("course"), Bytes.toBytes("math"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("100"));filters.add(filter2);FilterList filterList = new FilterList(filters);List<Result> rsList = client.findRow(tableName, filterList);log.info(">>>" + rsList.size());// 获取所有数据log.info("获取所有数据");rsList = client.findAllRows(tableName);log.info(">>>" + rsList.size());//删除一条数据log.info("删除一条数据");client.delRow(tableName, "tht");log.info(">>>" + rsList.size());//删除多条数据log.info("删除多条数据");List<String> rows = new ArrayList<String>();rows.add("xiaoxue");rows.add("walker");client.delMulitRows(tableName, rows);client.findAllRows(tableName);log.info(">>>" + rsList.size());//删除数据库log.info("删除表");client.deleteTable(tableName);} catch (Exception err) {err.printStackTrace();}}}
11、mongodb处理工具
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;import org.apache.commons.lang.StringUtils;
import org.bson.Document;import com.alibaba.fastjson.JSONObject;
import com.github.walker.mybatis.paginator.PageList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;public class MongoManager {private static MongoClient client = null; private MongoManager() { } static { initDBPrompties(); } /** * 初始化连接池 */ private static void initDBPrompties() { String url=PropertyHolder.getProperty("mongodb.url");String dbName=PropertyHolder.getProperty("mongodb.dbName"); String userName=PropertyHolder.getProperty("mongodb.userName");String password=PropertyHolder.getProperty("mongodb.password");int connectionsPerHost = Integer.valueOf(PropertyHolder.getProperty("mongodb.connectionsPerHost"));int threads = Integer.valueOf(PropertyHolder.getProperty("mongodb.threads"));int maxWaitTime=Integer.valueOf(PropertyHolder.getProperty("mongodb.maxWaitTime"));int socketTimeout=Integer.valueOf(PropertyHolder.getProperty("mongodb.socketTimeout"));int maxConnectionLifeTime=Integer.valueOf(PropertyHolder.getProperty("mongodb.maxConnectionLifeTime"));int connectTimeout = Integer.valueOf(PropertyHolder.getProperty("mongodb.connectTimeout"));List<MongoCredential> credentials = new ArrayList<MongoCredential>();ServerAddress address = new ServerAddress(url);MongoCredential credential = MongoCredential.createCredential(userName,dbName,password.toCharArray());credentials.add(credential);MongoClientOptions.Builder build = new MongoClientOptions.Builder(); build.connectionsPerHost(connectionsPerHost);build.maxWaitTime(maxWaitTime);build.maxConnectionLifeTime(maxConnectionLifeTime);build.connectTimeout(connectTimeout);build.threadsAllowedToBlockForConnectionMultiplier(threads);build.socketTimeout(socketTimeout);MongoClientOptions options = build.build(); client = new MongoClient(address, credentials, options); } /*** 获取数据库* @param dbName 数据库* @return*/public static MongoDatabase getDB(String dbName) { return client.getDatabase(dbName);}/*** 获取表* @param dbName 数据库* @param collectionName 集合* @return*/public static MongoCollection<Document> getCollection(String dbName,String collectionName){MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);return collection;}/*** 插入表数据* @param dbName 数据库* @param collectionName 集合* @param json 待入库json*/public static void insert(String dbName,String collectionName,String json){MongoCollection<Document> collection = getCollection(dbName, collectionName);Document document = Document.parse(json);collection.insertOne(document);}/*** 分页查询用户操作日志* @param dbName 数据库* @param collectionName 集合* @param acctNo 账户号* @param start * @param pageSize* @return*/public static PageList<UserOpLog> findUserOpLog(String dbName,String collectionName,String acctNo,String tenantId,String keyWord,String startDate,String endDate,int start,int pageSize){ List<UserOpLog> logList = new ArrayList<UserOpLog>();MongoCollection<Document> collection = getCollection(dbName, collectionName);BasicDBObject queryObject = new BasicDBObject();BasicDBObject tmpObject = new BasicDBObject();BasicDBObject dateObject = new BasicDBObject(); if(StringUtils.isNotEmpty(acctNo)){ queryObject.put("acctNo", acctNo); }if(tenantId!=null){queryObject.put("tenantId", tenantId); }if(StringUtils.isNotEmpty(keyWord)){ Pattern pattern = Pattern.compile("^.*"+keyWord+".*$", Pattern.CASE_INSENSITIVE);queryObject.put("opDesc", pattern); }tmpObject.put("$gte", startDate); //大于dateObject = tmpObject.append("$lte", endDate); //小于 queryObject.put("opTime", dateObject); FindIterable<Document> iterator= collection.find(queryObject).sort((new BasicDBObject("opTime",-1))); int count = 0;MongoCursor<Document> cursor= iterator.iterator();while(cursor.hasNext()) { Document doc = cursor.next();if(count>=start && count<=pageSize+start-1){ UserOpLog userOpLog = new UserOpLog();userOpLog.setAcctNo(doc.getString("acctNo"));userOpLog.setClasz(doc.getString("clasz"));userOpLog.setErrorMsg(doc.getString("errorMsg"));userOpLog.setMethod(doc.getString("method"));userOpLog.setName(doc.getString("name"));userOpLog.setOpDesc(doc.getString("opDesc"));userOpLog.setOpResult(doc.getInteger("opResult"));userOpLog.setOpTime(doc.getString("opTime"));userOpLog.setUri(doc.getString("uri"));userOpLog.setTenantId(doc.getString("tenantId"));logList.add(userOpLog);}count++;} cursor.close();PageList<UserOpLog> pageList = new PageList<UserOpLog>(logList,count);return pageList; }/*** 分页查询接口调用日志* @param dbName 数据库* @param collectionName 集合* @param tenantId 商户ID* @param appId 应用ID* @param startDate 开始日期* @param endDate 结束日期* @param start* @param pageSize* @return*/public static PageList<UserCallLog> findUserCallLog(String dbName,String collectionName,String tenantId,String appId,String startDate,String endDate,int start,int pageSize){ List<UserCallLog> logList = new ArrayList<UserCallLog>();MongoCollection<Document> collection = getCollection(dbName, collectionName);BasicDBObject queryObject = new BasicDBObject();BasicDBObject tmpObject = new BasicDBObject();BasicDBObject dateObject = new BasicDBObject(); if(StringUtils.isNotEmpty(tenantId)){queryObject.put("tenantId", tenantId); }if(StringUtils.isNotEmpty(appId)){queryObject.put("appId", appId); } tmpObject.put("$gte", startDate); //大于dateObject = tmpObject.append("$lte", endDate); //小于 queryObject.put("reqTime", dateObject); FindIterable<Document> iterator= collection.find(queryObject) ; int count = 0;MongoCursor<Document> cursor= iterator.iterator();while(cursor.hasNext()) { Document doc = cursor.next();if(count>=start && count<=pageSize+start-1){ UserCallLog userCallLog = new UserCallLog();userCallLog.setAppId(doc.getString("appId"));userCallLog.setClientHost(doc.getString("clientHost"));userCallLog.setClientIp(doc.getString("clientIp"));userCallLog.setClientPort(doc.getInteger("clientPort"));userCallLog.setErrorCode(doc.getString("errorCode"));userCallLog.setErrorMsg(doc.getString("errorMsg"));userCallLog.setFlowNo(doc.getString("flowNo"));userCallLog.setInterfaceClasz(doc.getString("interfaceClasz"));userCallLog.setInterfaceId(doc.getString("interfaceId"));userCallLog.setMethodId(doc.getString("methodId"));userCallLog.setMethodName(doc.getString("methodName"));userCallLog.setReqBytes(doc.getInteger("reqBytes"));userCallLog.setReqTime(doc.getString("reqTime"));userCallLog.setResBytes(doc.getInteger("resBytes"));userCallLog.setResTime(doc.getString("resTime"));userCallLog.setSvcId(doc.getString("svcId"));userCallLog.setSvcInterface(doc.getString("svcInterface"));userCallLog.setTenantId(doc.getString("tenantId"));userCallLog.setToken(doc.getString("token"));userCallLog.setUri(doc.getString("uri"));logList.add(userCallLog);}count++;} cursor.close();PageList<UserCallLog> pageList = new PageList<UserCallLog>(logList,count);return pageList; }}
12、redis处理工具
- import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPool;
- import java.util.Map;
- import java.util.Properties;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- public class QCloudJedis {
- private static final Logger log = LoggerFactory.getLogger(QCloudJedis.class);
- private static final Properties properties = ClassesConfigLoader.getProperties();
- private static final String host = properties.getProperty("redis.host");
- private static final int port = Integer.valueOf(properties.getProperty("redis.port"));
- private static final String instanceid = properties.getProperty("redis.instanceid");
- private static final String password = properties.getProperty("redis.password");
- private static final int timeout = Integer.valueOf(properties.getProperty("redis.timeout", "2000"));
- private static final int maxTotal = Integer.valueOf(properties.getProperty("redis.maxTotal", "1024"));
- private static final int maxIdle = Integer.valueOf(properties.getProperty("redis.maxIdle", "10"));
- private static final int maxWaitMillis = Integer.valueOf(properties.getProperty("redis.maxWaitMillis", "3000"));
- private static final boolean testOnIdle = Boolean.valueOf(properties.getProperty("redis.testOnIdle", "true")); //是否checkIdle
- private static final int timeCheckIdle = Integer.valueOf(properties.getProperty("redis.timeCheckIdle", "60000")); //每隔多少秒check一次
- private static final int idleTimeout = Integer.valueOf(properties.getProperty("redis.idleTimeout", "300000")); //超时时间
- private static final int numTestsPerEvictionRun = Integer.valueOf(properties.getProperty("redis.numTestsPerEvictionRun", "1024")); //一次驱逐过程中,最多驱逐对象的个数
- private static JedisPool pool = null;
- //private static Jedis jedis = null;
- private static Object lock = new Object();
- static {
- init();
- }
- private static void init() {
- if (null == pool) {
- GenericObjectPoolConfig config = new GenericObjectPoolConfig();
- config.setMaxTotal(maxTotal);
- config.setMaxIdle(maxIdle);
- config.setMaxWaitMillis(maxWaitMillis);
- config.setTestWhileIdle(testOnIdle);
- config.setTimeBetweenEvictionRunsMillis(timeCheckIdle);
- config.setMinEvictableIdleTimeMillis(idleTimeout);
- config.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
- synchronized (lock) {
- if (null == pool) {
- try {
- pool = new JedisPool(config, host, port, timeout, instanceid + ":" + password);
- log.info("init jedis pool successful!");
- } catch (Exception e) {
- log.error("", e);
- }
- }
- }
- }
- }
- // public static Jedis getInstance() {
- // init();
- //
- // return jedis;
- // }
- /**
- * 获取一个jedis 对象
- *
- * @return
- */
- private static Jedis getJedis() {
- if (pool == null) {
- init();
- }
- return pool.getResource();
- }
- /**
- * 返还到连接池
- *
- * @param pool
- * @param redis
- */
- private static void returnResource(Jedis redis) {
- if (redis != null) {
- redis.close();
- }
- }
- // 删除key
- public static Long del(String key) {
- Jedis jedis = null;
- try {
- jedis = getJedis();
- return jedis.del(key);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- return -1L;
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- }
- public static Boolean exists(String key) {
- Jedis jedis = null;
- Boolean flag = false;
- try {
- jedis = getJedis();
- flag = jedis.exists(key);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- return flag;
- }
- /**
- * 获取数据
- *
- * @param key
- * @return
- */
- public static String get(String key) {
- String value = null;
- Jedis jedis = null;
- try {
- jedis = getJedis();
- value = jedis.get(key);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- return value;
- }
- // 设置
- public static String set(String key, String value) {
- Jedis jedis = null;
- try {
- jedis = getJedis();
- return jedis.set(key, value);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- return "";
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- }
- // 获取Hash值
- public static String hget(String key, String field) {
- Jedis jedis = null;
- String value = null;
- try {
- jedis = getJedis();
- value = jedis.hget(key, field);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- return value;
- }
- public static Map<String, String> hgetAll(String key) {
- Jedis jedis = null;
- Map<String, String> value = null;
- try {
- jedis = getJedis();
- value = jedis.hgetAll(key);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- return value;
- }
- // 设置Hash值
- public static Long hset(String key, String field, String value) {
- Jedis jedis = null;
- try {
- jedis = getJedis();
- return jedis.hset(key, field, value);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- return -1L;
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- }
- // 删除Hash值
- public static Long hdel(String key, String... fields) {
- Jedis jedis = null;
- try {
- jedis = getJedis();
- return jedis.hdel(key, fields);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- return -1L;
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- }
- public static Long expire(String key, int seconds) {
- Jedis jedis = null;
- try {
- jedis = getJedis();
- return jedis.expire(key, seconds);
- } catch (Exception e) {
- log.error("操作Redis发生异常,异常详情:", e);
- return -1L;
- } finally {
- // 返还到连接池
- returnResource(jedis);
- }
- }
- public static void main(String[] args) {
- try {
- while (true) {
- String key = "ftc-ump-mid";
- //System.out.println("before setting: " + jedis.hget(key, "attr"));
- System.out.println(">>" + QCloudJedis.hset(key, "attr", "0"));
- QCloudJedis.expire(key, 5);
- System.out.println("after setting: " + QCloudJedis.hget(key, "attr"));
- System.out.println(">>" + QCloudJedis.hdel(key, "attr"));
- System.out.println("after delete: " + QCloudJedis.hget(key, "attr"));
- Thread.sleep(1000 * 10);
- }
- //关闭退出
- //jedis.quit();
- //jedis.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
Java常用公共工具记录相关推荐
- 第二章 java常用开发工具以及程序的编写
2019独角兽企业重金招聘Python工程师标准>>> 第二章 java常用开发工具以及程序的编写 1. 程序的概念 2. java程序的开发的三个步骤 ...
- Java常用的工具有哪些?
Java开发工具有很多,本篇就来给大家分享几个Java常用的工具! 1.Site24x7 使用Site24x7 APM Insight监控 Java 应用程序的性能. Site24x7 是一种基于 S ...
- Java常用开发工具介绍
Java常用开发工具介绍 编辑器 记事本 Notepad++ EditPlus UltraEdit(UE) 其它文本编辑器 集成开发环境 JBuilder Eclipse NetBeans
- java常用文件工具类
java常用工具类(一) 主要是Java操作文件及及IO流的一些常用库,是Apache对java的IO包的封装,这里面文件类工具有两个非常核心的类FilenameUtils跟FileUtils,IO流 ...
- JAVA java学习(9)——————java常用开发工具介绍
下面这些工具或许功能和作用不同,但是有着一个共同的主旨,那就是--它们都是为了给 Java 编码和开发提供卓越的支持. 常用源码编辑工具介绍 ava 源代码本质上其实就是普通的文本文件,所以理论上来说 ...
- java常用开发工具
常用源码编辑工具 Java 源代码本质上其实就是普通的文本文件,所以理论上来说任何可以编辑文本文件的编辑器都可以作为我们的 Java 代码编辑工具.比如:Windows 记事本,Mac OS X 下的 ...
- Java教程:Java常用开发工具有哪些?
Java教程本节介绍一下 Java 常用的几个开发工具.下面这些工具或许功能和作用不同,但是有着一个共同的主旨,那就是--它们都是为了给 Java 编码和开发提供卓越的支持. 常用源码编辑工具介绍 J ...
- Java常用加密算法工具类
import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; import ...
- Java常用分析工具Jps、Jstat、Jinfo、Jstack以及Jconsole的简单介绍和使用
JVM参数查看 java -XX:+PrintFlagsFinal和java -XX:+PrintCommandLineFlags 1. JVM Process Status(Jps) 可以列出正在运 ...
最新文章
- Puppet--用户自动化管理
- 怎样使用OpenCV进行人脸识别
- 【项目管理】沟通管理
- linux中cd命令及范例,15个Linux中的“cd”命令的实际示例
- DataProtection设置问题引起不同ASP.NET Core站点无法共享用户验证Cookie
- 快速成长为数据挖掘高手的秘诀
- 算法训练 瓷砖铺放 递归
- MongoDB 复制集的选举原理
- ES6学习笔记(三)—— Set 和 Map
- oracle导出导入数据库
- virtualenv -p python3 venv报错
- slub释放过程-do_slab_free
- 【jQuery进阶】子菜单插件Slight Submenu
- sshd远程主机间的访问
- 景观分析(二)——Patch Analyst 5
- WinSock网络编程基础(1)
- 用大白菜装centos7_大白菜安装centos7iso
- android充当server服务器
- Orc-Battle
- JS逆向加密——美团店铺详情_token参数
热门文章
- >python可视化神器altair
- 集丰照明|目前已发布的半导体照明电子行业标准有哪些?
- 程序猿长时间面对电脑,眼睛着不住呀。给大家介绍一种软件,护眼的。
- 北京大学再次选择AnyBackup,印证爱数灾备云高校数据保护实力
- 如何把heic格式转换为jpg
- The content of element type “mapper“ must match “EMPTY“.错误
- CSP_20140301相反数
- 【Fabric】简单测试:链码单元测试+fabric-go-sdk
- 人脸对齐算法常用评价标准
- php电销源码部署,【独家分享】最新价值4800接单运营版电销语音机器人完整版源码+文字安装教程...