Java实现Base64编码
更新时间:
Java实现Base64编码有以下四种方法
方法一:使用commons-codec
官网:http://commons.apache.org/proper/commons-codec/archives/1.11/userguide.html
maven项目需要的依赖:
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
Java实现代码:
String base64String="https://tool.hiofd.com";
byte[] result = Base64.encodeBase64(base64String.getBytes());
方法二:使用sun.misc.BASE64Encoder
Java实现代码:
/**
* 编码
*
* @param content
* @return
*/
public static String encode(byte[] content) {
return new sun.misc.BASE64Encoder().encode(content);
}
/**
* 解码
*
* @param source
* @return
*/
public static byte[] decode(String source) {
try {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
return decoder.decodeBuffer(source);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
方法三:使用com.sun.org.apache.xerces.internal.impl.dv.util.Base64
Java实现代码:
/**
* 编码
*
* @param input
* @return
* @throws Exception
*/
public static String encodeBase64(byte[] input) throws Exception {
Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
Method mainMethod = clazz.getMethod("encode", byte[].class);
mainMethod.setAccessible(true);
Object retObj = mainMethod.invoke(null, new Object[]{input});
return (String) retObj;
}
/**
* 解码
*
* @param input
* @return
* @throws Exception
*/
public static byte[] decodeBase64(String input) throws Exception {
Class clazz = Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
Method mainMethod = clazz.getMethod("decode", String.class);
mainMethod.setAccessible(true);
Object retObj = mainMethod.invoke(null, input);
return (byte[]) retObj;
}
方法四:使用Java8 Base64
Java实现代码:
import java.io.UnsupportedEncodingException;
import java.util.Base64;
/**
* @Author fankunfeng
* @Date 2019-01-22 14:39:23
* @Describe Java8之后Util包Base64编码,比apache方式效率更高
*/
public class JavaBase64Util {
public static final String UTF_8 = "UTF-8";
public static Base64.Encoder encoder;
//即为安全的编码方式,替换“+” “/” “-”为“_”
public static Base64.Encoder urlEncoder;
public static Base64.Decoder decoder;
public static Base64.Decoder urlDecoder;
static {
encoder = Base64.getEncoder();
urlEncoder = Base64.getUrlEncoder();
decoder = Base64.getDecoder();
urlDecoder = Base64.getUrlDecoder();
}
//encode
public static byte[] encode(byte[] bytes) {
return encoder.encode(bytes);
}
public static String encode(String string) {
byte[] encode = encode(string.getBytes());
try {
return new String(encode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String encode2String(byte[] bytes) {
return encoder.encodeToString(bytes);
}
public static byte[] encode2Byte(String string) {
return encode(string.getBytes());
}
//urlEncoder
public static byte[] urlEncode(byte[] bytes) {
return urlEncoder.encode(bytes);
}
public static String urlEncode(String string) {
byte[] encode = urlEncode(string.getBytes());
try {
return new String(encode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String urlEncode2String(byte[] bytes) {
return urlEncoder.encodeToString(bytes);
}
public static byte[] urlEncode2Byte(String string) {
return urlEncode(string.getBytes());
}
//decode
public static byte[] decode(byte[] bytes) {
return decoder.decode(bytes);
}
public static byte[] decode2Byte(String string) {
return decoder.decode(string.getBytes());
}
public static String decode2String(byte[] bytes) {
try {
return new String(decoder.decode(bytes),UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String decode(String string) {
byte[] decode = decode(string.getBytes());
try {
return new String(decode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
//urlDecode
public static byte[] urlDecode(byte[] bytes) {
return urlDecoder.decode(bytes);
}
public static byte[] urlDecode2Byte(String string) {
return urlDecode(string.getBytes());
}
public static String urlDecode2String(byte[] bytes) {
try {
return new String(urlDecode(bytes),UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static String urlDecode(String string) {
byte[] decode = urlDecode(string.getBytes());
try {
return new String(decode, UTF_8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
Java实现Base64编方法性能对比测试
commons-codec 1.12 与 java.util.Base64
此处编写了测试代码比较两个工具类的效率,测试的基础字符为“abcdeABCDE”,分别叠加次数【1000 * 1000,1000 * 1000 * 10,1000 * 1000 * 20,1000 * 1000 * 40】,
代码如下:
import java.util.Calendar;
/**
1. @author fan
2. @create 2019-06-16 20:17
3. @description
4. @see
*/
public class Base64Test {
public static StringBuffer sb = new StringBuffer("abcdeABCDE");
public static final Base64Test test = new Base64Test();
public static void main(String[] args) {
test.num(1000*1000);
test.num(1000*1000*10);
test.num(1000*1000*20);
test.num(1000*1000*40);
}
public void num(int num){
for (int i = 0; i < num ; i++) {
sb = sb.append(i);
}
test.javaBase64(num,sb.toString());
test.apacheBase64(num,sb.toString());
}
public void javaBase64(int num,String string){
long startTime = Calendar.getInstance().getTimeInMillis();
String encode = JavaBase64Util.encode(string);
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("Java Base64 encode 次数:"+num+"花费时间:"+ (endTime-startTime)+" ms");
long startTime2 = Calendar.getInstance().getTimeInMillis();
JavaBase64Util.decode(encode);
long endTime2 = Calendar.getInstance().getTimeInMillis();
System.out.println("Java Base64 decode 次数:"+num+"花费时间:"+ (endTime2-startTime2)+" ms");
}
public void apacheBase64(int num,String string){
long startTime = Calendar.getInstance().getTimeInMillis();
String encode = ApacheBase64Util.encode(string);
long endTime = Calendar.getInstance().getTimeInMillis();
System.out.println("apache Base64 encode 次数:"+num+" 花费时间:"+(endTime-startTime)+" ms");
long startTime2 = Calendar.getInstance().getTimeInMillis();
ApacheBase64Util.encode(encode);
long endTime2 = Calendar.getInstance().getTimeInMillis();
System.out.println("apache Base64 encode 次数:"+num+"花费时间:"+(endTime2-startTime2)+" ms");
}
}
测试结果:
Java Base64 encode 次数:1000000花费时间:80 ms
Java Base64 decode 次数:1000000花费时间:48 ms
apache Base64 encode 次数:1000000 花费时间:106 ms
apache Base64 encode 次数:1000000花费时间:99 ms
Java Base64 encode 次数:10000000花费时间:362 ms
Java Base64 decode 次数:10000000花费时间:484 ms
apache Base64 encode 次数:10000000 花费时间:662 ms
apache Base64 encode 次数:10000000花费时间:797 ms
Java Base64 encode 次数:20000000花费时间:910 ms
Java Base64 decode 次数:20000000花费时间:1268 ms
apache Base64 encode 次数:20000000 花费时间:1718 ms
apache Base64 encode 次数:20000000花费时间:2449 ms
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
at java.lang.StringCoding.encode(StringCoding.java:344)
at java.lang.StringCoding.encode(StringCoding.java:387)
at java.lang.String.getBytes(String.java:958)
at com.fan.utils.JavaBase64Util.encode(JavaBase64Util.java:31)
at com.fan.think.Base64Test.javaBase64Test(Base64Test.java:36)
at com.fan.think.Base64Test.num(Base64Test.java:30)
at com.fan.think.Base64Test.main(Base64Test.java:23)
结论:建议使用java.util.Base64,文件越大的场景 更加推荐 后续次数比较多内存溢出了,但是仍然可以很明显的看出Java8的执行效率比较高,文件越大越明显,推荐使用。