系统对外提供图片上传接口,但是要求上送的图片需要是Base64的字符串。
症状:上送过来的串经过hex2String的时候效率极低
经过研究发现是本地hex2String的方法存在问题
---------------------old hex 2 String -----------------------
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
可以看出原先是对原先的Base64String进行getByte之后,对byte数组进行逐个操作且因为Integer.toHexString(b[i] & 0xFF);如果产生的String结果不一样每次都会创建一个新的String对象(因为String是不可变量,每次对String进行操作都会产生新的对象)。
下面是测试样例以及改进的代码:
package Test;
import org.apache.commons.codec.binary.Hex;
public class testHex2String {
public static void main(String[] args) {
String rawString=": {\"IdPBSide\":\"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQdkUdxN3fJHA+h+3jn3fc+0cFBZ4ABDEDsD3FNXarF38N1GRpSnFFKL4rMeLvKNHj/AAEIElZVxe2rx7at7/aseeDr/9k=\",\"SendTransCode\":\"MELEIdPhotoUpload\",\"ActivityStart\":\"\",\"ChannelHeadRequest\":{\"ChannelId\":\"99045\",\"ChannelDate\":\"20181227\",\"ChannelJnlNo\":\"62169220181227990000001990450000\"},\"IdNo\":\"300000200010100000\",\"IdAddress\":\"\",\"CifName\":\"8888\",\"EProtocolAcNo\":\"\"}";
Long timeLong=System.currentTimeMillis();
System.out.println(rawString.length());
bytes2HexString(rawString.getBytes());
System.out.println("--------11--------");
System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
timeLong=System.currentTimeMillis();
hex2String(rawString.getBytes());
System.out.println("--------22--------");
System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
timeLong=System.currentTimeMillis();
bytes2HexStrBuffer(rawString.getBytes());
System.out.println("--------33--------");
System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
timeLong=System.currentTimeMillis();
bytes2HexStrBuild(rawString.getBytes());
System.out.println("--------44--------");
System.out.println(" 累计耗时:"+(System.currentTimeMillis()-timeLong));
}
/**
* Byte数组转十六进制字符串字节间不用空格分隔
*
* @param b
* @return
*/
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = "0" + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
/**
* Byte数组转十六进制字符串字节间不用空格分隔
*
* @param b
* @return
*/
public static String bytes2HexStrBuild(byte[] b) {
String ret = "";
StringBuilder sbZero=new StringBuilder("0");
StringBuilder result=new StringBuilder();
for (int i = 0; i < b.length; i++) {
StringBuilder sb=new StringBuilder();
sb.append(Integer.toHexString(b[i] & 0xFF));
if (sb.length() == 1) {
sb = sbZero.append(sb);
}
result.append(sb);
}
ret=result.toString().toUpperCase();
return ret;
}
/**
* Byte数组转十六进制字符串字节间不用空格分隔
*
* @param b
* @return
*/
public static String bytes2HexStrBuffer(byte[] b) {
String ret = "";
StringBuffer sbZero=new StringBuffer("0");
StringBuffer result=new StringBuffer();
for (int i = 0; i < b.length; i++) {
StringBuffer sb=new StringBuffer();
sb.append(Integer.toHexString(b[i] & 0xFF));
if (sb.length() == 1) {
sb = sbZero.append(sb);
}
result.append(sb);
}
ret=result.toString().toUpperCase();
return ret;
}
public static String hex2String(byte[] data){
return Hex.encodeHexString(data);
}
}
测试结果如下:此处的测试String被我截取部分,原始长度为205244。太长的字符串能明显看出String、StringBuilder、StringBuffer的区别。
205244
--------11--------
累计耗时:37785
--------22--------
累计耗时:23
--------33--------
累计耗时:24
--------44--------
累计耗时:22