이 글은 주로 Java8의 새로운 기능인 Base64 관련 정보를 자세히 소개하고 있습니다. 관심 있는 친구들이 참고할 수 있습니다.
BASE64 인코딩은 널리 사용되는 문자 인코딩입니다. 사용된. 하지만 Base64는 보안 분야의 암호화 및 복호화 알고리즘이 아닙니다. 보안 효과가 매우 낮고 크랙이 쉽습니다. 핵심 기능은 전송된 데이터의 정확성이어야 합니다. 일부 게이트웨이 또는 시스템은 ASCII 문자만 사용할 수 있습니다. Base64는 ASCII가 아닌 문자 데이터를 ASCII 문자로 변환하는 데 사용되는 방법으로, base64는 특히 http 및 MIME 프로토콜에서 빠른 데이터 전송에 적합합니다.
JDK는 Base64 API를 구현합니다
JDK1.6 이전에는 JDK 핵심 클래스에 Base64 구현 클래스가 없었습니다. 일부 사람들은 Sun/Oracle JDK에서 sun.misc.BASE64Encoder 및 sun.misc.BASE64Decoder를 사용하도록 제안했습니다. 이를 사용하면 타사 클래스 라이브러리에 의존할 필요가 없다는 점입니다. 단점은 향후 버전에서 삭제될 수 있고(maven으로 컴파일하면 경고가 표시됨) 성능이 좋지 않다는 것입니다. 나중에 성능 테스트를 해보세요.
또 다른 Base64 구현이 JDK1.6에 추가되었습니다. javax.xml.bind.DatatypeConverter에는 두 개의 정적 메소드인 parseBase64Binary 및 printBase64Binary가 있는데, 이는 javax.xml.bind 패키지 아래에 숨겨져 있으며 많은 개발자에게 알려지지 않았습니다.
Java 8에서는 java.util 패키지 아래에 BASE64 인코딩 및 디코딩 API가 구현되어 있으며 성능도 좋고 API도 간단하고 이해하기 쉽습니다.
java.util.Base64
이 클래스는 다음 세 가지 BASE64 코덱을 얻기 위한 정적 메서드 세트를 제공합니다.
1) 기본 인코딩: 일반적인 요구 사항을 처리하는 데 사용되는 표준 BASE64 인코딩입니다.
// 编码 String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8")); System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc= // 解码 byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc="); System.out.println(new String(asBytes, "utf-8")); // 输出为: some string
2) URL 인코딩: 밑줄을 사용하여 URL의 백슬래시 "/"를 대체합니다.
String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8")); System.out.println("Using URL Alphabet: " + urlEncoded); // 输出为: Using URL Alphabet: c3ViamVjdHM_YWJjZA==
3) MIME 인코딩: 기본 영숫자를 사용하여 BASE64 출력을 생성하고 MIME 형식에 친숙합니다. 출력의 각 줄은 76자를 초과할 수 없으며 각 줄은 "rn" 문자로 끝나야 합니다.
StringBuilder sb = new StringBuilder(); for (int t = 0; t < 10; ++t) { sb.append(UUID.randomUUID().toString()); } byte[] toEncode = sb.toString().getBytes("utf-8"); String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode); System.out.println(mimeEncoded);
Base64 API의 타사 구현
첫 번째는 일반적으로 사용되는 Apache Commons Codec 라이브러리의 org.apache.commons.codec.binary.Base64입니다.
두 번째는 Google Guava 라이브러리입니다. 내부의 정적 메소드 com.google.common.io.BaseEncoding.base64()
세 번째 것은 net.iharder.Base64이며, 이 jar 패키지는 단지 하나의 클래스입니다.
마지막 것은 가장 빠른 것으로 알려진 MigBase64입니다. Base64 인코딩 속도는 10년 전에 구현되었으며 지금 이 제목을 유지할 수 있는지 여부는 테스트해 보면 알 수 있습니다.
Base64 인코딩 성능 테스트
위에서 언급한 Base64 인코딩은 총 7가지입니다. , Jdk에는 첫 번째 4가지 유형의 타사 구현이 있습니다. 일단 선택하면 성능 테스트가 가장 직접적인 방법입니다. 두 인터페이스의 차이점을 정의합니다. 인터페이스는 바이트 배열을 수신하고 바이트 배열을 반환하는 인터페이스입니다. byte->byte 또는 byte->String보다 빠르므로 테스트를 위해 두 그룹이 구분됩니다
private static interface Base64Codec { public String encode(final byte[] data); public byte[] decode(final String base64) throws IOException; } private static interface Base64ByteCodec { public byte[] encodeBytes(final byte[] data); public byte[] decodeBytes(final byte[] base64) throws IOException; }
private static final Base64Codec[] m_codecs = { new GuavaImpl(), new JavaXmlImpl(), new Java8Impl(), new SunImpl(), new ApacheImpl(),new MiGBase64Impl(),new IHarderImpl() }; private static final Base64ByteCodec[] m_byteCodecs = { new ApacheImpl(), new Java8Impl(),new MiGBase64Impl(),new IHarderImpl() };
다음 코드는 기본적으로 Base64를 구현하기 위한 다양한 API에 대한 코드입니다. . 자세히 나열되어 있습니다.
주요 테스트 방법은 100M 난수를 생성하여 100바이트 또는 1000바이트 블록으로 나눈 후 각각 인코딩, 디코딩하고 시간을 기록하는 것입니다
private static class Java8Impl implements Base64Codec, Base64ByteCodec { private final Base64.Decoder m_decoder = Base64.getDecoder(); private final Base64.Encoder m_encoder = Base64.getEncoder(); @Override public String encode(byte[] data) { return m_encoder.encodeToString(data); } @Override public byte[] decode(String base64) throws IOException { return m_decoder.decode(base64); } public byte[] encodeBytes(byte[] data) { return m_encoder.encode( data ); } public byte[] decodeBytes(byte[] base64) throws IOException { return m_decoder.decode( base64 ); } } private static class JavaXmlImpl implements Base64Codec //no byte[] implementation { public String encode(byte[] data) { return DatatypeConverter.printBase64Binary( data ); } public byte[] decode(String base64) throws IOException { return DatatypeConverter.parseBase64Binary( base64 ); } } ..............
jvm 매개변수 :-Xms512m -Xmx4G
요약
좋은 성능과 안정성을 갖춘 Base64 코덱이 필요하다면 JDK 외부에서 찾지 마세요. java8에는 java.util.Base64가 있고 깊게 숨겨져 있는 javax.xml.bind가 있습니다. java6.DatatypeConverter에서는 둘 다 좋은 선택입니다.
위 내용은 Java8-Base64의 새로운 기능 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!