>Java >java지도 시간 >Java8-Base64의 새로운 기능 해석

Java8-Base64의 새로운 기능 해석

零下一度
零下一度원래의
2017-06-17 14:10:201878검색

이 글은 주로 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;
  }

위에서 볼 수 있듯이 byte->byte를 지원하는 API는 4개뿐입니다.


7 Base64 구현 클래스



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


위에서 모든 것이 명백하게 나타납니다. IHarder와 MigBase64의 성능은 그다지 좋지 않다는 것을 알 수 있습니다. 그것은 또한 과거의 테스트입니다. 결과에서는 새로운 java8 base64가 가장 잘 실행되었으며 그 다음은 javaXml입니다.


요약

좋은 성능과 안정성을 갖춘 Base64 코덱이 필요하다면 JDK 외부에서 찾지 마세요. java8에는 java.util.Base64가 있고 깊게 숨겨져 있는 javax.xml.bind가 있습니다. java6.DatatypeConverter에서는 둘 다 좋은 선택입니다.

위 내용은 Java8-Base64의 새로운 기능 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.