이 글의 내용은 Java에서 Base64 인코딩과 디코딩을 구현하는 방법을 소개하는 것입니다. Base64 인코딩 및 디코딩의 4가지 방법을 구현합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
Base64 인코딩을 사용하는 이유는 무엇인가요?
데이터는 ASCII를 사용하여 네트워크를 통해 전송됩니다. 일부 사진, 비디오 및 기타 데이터의 경우 ASCII의 보이지 않는 부분으로 인코딩될 수 있습니다. 네트워크의 다양한 라우팅 장치는 이를 다르게 처리하므로 데이터의 이 부분이 손실될 수 있습니다. 데이터 전송의 정확성을 보장하기 위해 Base64 인코딩을 사용하여 보이지 않는 데이터를 보이는 데이터로 인코딩할 수 있습니다.
Java에서 Base64 인코딩 및 디코딩을 구현하는 여러 가지 방법
방법 1
인코딩 및 디코딩을 위해 sun.misc 패키지의 BASE64Encoder 및 BASE64Decoder 클래스를 사용하세요. 이 방법은 비교적 오래되었으므로 권장되지 않습니다.
코드는 다음과 같습니다.
/** * sun.misc方式Base64编码 * @param str * @return */ public static String encodeBySunMisc(String str) { try { return new BASE64Encoder().encode(str.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } /** * sun.misc方式Base64解码 * @param str * @return */ public static String decodeBySunMisc(String str) { try { byte[] result = new BASE64Decoder().decodeBuffer(str); return new String(result); } catch (IOException e) { e.printStackTrace(); return ""; } }
sun.misc의 Base64 도구는 jdk에 있지만 표준 라이브러리에 속하지 않으므로 Eclipse에서 직접 사용할 수 없습니다. 수동 소개를 통해 사용할 수 있습니다.
해결책:
프로젝트->속성->Java 빌드 경로->라이브러리를 마우스 오른쪽 버튼으로 클릭하고 외부 Jar 추가를 클릭한 다음 %JAVA_HOME%jrelibrt.jar을 선택합니다.
방법 2
Apache의 commons-code 패키지를 사용하세요. 이 방법은 sun.misc 방법보다 약간 빠릅니다.
코드는 다음과 같습니다
/** * commons-code方式Base64编码 * @param str * @return */ public static String encodeByCommonsCode(String str) { byte[] result; try { result = org.apache.commons.codec.binary.Base64.encodeBase64(str.getBytes("UTF-8")); return new String(result); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } /** * commons-code方式Base64解码 * @param str * @return */ public static String decodeByCommonsCode(String str) { byte[] result = org.apache.commons.codec.binary.Base64.decodeBase64(str.getBytes()); return new String(result); }
commons-code를 사용하려면 종속성을 도입해야 합니다. Gradle 프로젝트를 예로 들면, build.gradle에 다음 라인을 추가해야 합니다:
implementation 'commons-codec:commons-codec:1.11'
방법 3
Apache의 xerces 도구를 사용하세요. 이 도구는 주로 xml을 구문 분석하는 데 사용되며 Base64 인코딩 및 디코딩 기능을 가지고 있습니다.
코드는 다음과 같습니다.
/** * xerces方式Base64解码 * @param str * @return */ public static String decodeByXerces(String str) { try { byte[] result = com.sun.org.apache.xerces.internal.impl.dv.util.Base64.decode(str); return new String(result); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * Java8中的Base64编码 * @param str * @return */ public static String encodeByJava8(String str) { try { return Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); return ""; } }
방법 4
Java8의 유틸리티 제품군에는 이미 Base64 인코딩 및 디코딩 도구가 포함되어 있으므로 이 방법을 사용하는 것이 매우 효율적입니다.
코드는 다음과 같습니다.
/** * Java8中的Base64编码 * @param str * @return */ public static String encodeByJava8(String str) { try { return Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * Java8中的Base64解码 * @param str * @return */ public static String decodeByJava8(String str) { byte[] result = Base64.getDecoder().decode(str.getBytes()); return new String(result); }
여러 코딩 효과 테스트:
테스트 코드는 다음과 같습니다.
private static void testEncodeAndDecode(String src) { String encedeStr1 = encodeBySunMisc(src); System.out.println("encode by sun misc: " + encedeStr1); String decedeStr1 = decodeBySunMisc(encedeStr1); System.out.println("decode by sun misc: " + decedeStr1); String encedeStr2 = encodeByCommonsCode(src); System.out.println("encode by commons-code: " + encedeStr2); String decedeStr2 = decodeByCommonsCode(encedeStr2); System.out.println("decode by commons-code: " + decedeStr2); String encedeStr3 = encodeByXerces(src); System.out.println("encode by xerces: " + encedeStr3); String decodeStr3 = decodeByXerces(encedeStr3); System.out.println("decode by xerces: " + decodeStr3); String encedeStr4 = encodeByJava8(src); System.out.println("encode by java8: " + encedeStr4); String decedeStr4 = decodeByJava8(encedeStr4); System.out.println("decode by java8: " + decedeStr4); }
테스트 결과는 다음과 같습니다.
encode by sun misc: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by sun misc: abcdefghijklmnopqrst; encode by commons-code: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by commons-code: abcdefghijklmnopqrst; encode by xerces: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by xerces: abcdefghijklmnopqrst; encode by java8: YWJjZGVmZ2hpamtsbW5vcHFyc3Q7 decode by java8: abcdefghijklmnopqrst;
여러 코덱의 효율성을 비교합니다. 각 인코딩 방법에 대해 20자 이상을 사용하여 먼저 인코딩한 다음 디코딩합니다. 총 실행 시간은 100만 번입니다.
테스트 코드는 다음과 같습니다.
// 测试sun.misc编解码效率 private static void testSunMisc(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeBySunMisc(src + i); decodeBySunMisc(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("sun misc consume: " + (finish - begin) + "ms"); } // 测试commons-code编解码效率 private static void testCommonsCode(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByCommonsCode(src + i); decodeByCommonsCode(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("commons-code consume: " + (finish - begin) + "ms"); } // 测试xerces编解码效率 private static void testXerces(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByXerces(src + i); decodeByXerces(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("xerces consume: " + (finish - begin) + "ms"); } // 测试Java8编解码效率 private static void testJava8(String src) { long begin = System.currentTimeMillis(); for(int i = 0; i < 1000000; i++) { String encedeStr1 = encodeByJava8(src + i); decodeByJava8(encedeStr1); } long finish = System.currentTimeMillis(); System.out.println("java 8 consume: " + (finish - begin) + "ms"); } public static void main(String[] args) { String src = "abcdefghijklmnopqrst;"; testSunMisc(src); testCommonsCode(src); testXerces(src); testJava8(src); }
총 3번 테스트한 결과 출력 결과는 다음과 같습니다.
commons-code consume: 3337ms sun misc consume: 6532ms xerces consume: 554ms java 8 consume: 547ms commons-code consume: 3148ms sun misc consume: 6445ms xerces consume: 498ms java 8 consume: 466ms commons-code consume: 3442ms sun misc consume: 6674ms xerces consume: 470ms java 8 consume: 512ms
결론
고대 sun.misc 방법은 효율성이 가장 낮고 xerces 및 Java8 방법은 효율성이 가장 낮습니다. 가장 효율적입니다. Java8의 편리성으로 인해 인코딩 및 디코딩에는 Java8과 함께 제공되는 Base64 도구를 직접 사용하는 것이 좋습니다.
위 내용은 Java는 Base64 인코딩 및 디코딩을 어떻게 구현합니까? Base64 인코딩 및 디코딩의 4가지 방법 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!