ホームページ  >  記事  >  Java  >  Java8 の新機能の解釈 -- Base64

Java8 の新機能の解釈 -- Base64

零下一度
零下一度オリジナル
2017-06-17 14:10:201826ブラウズ

この記事では、主に Java8 の新機能である Base64 の関連情報を詳しく紹介します。興味のある方は参考にしてください。

BASE64 エンコーディングは、多くの場所で使用されている、一般的に使用される文字エンコーディングです。使用済み。ただし、base64 はセキュリティ分野の暗号化および復号化アルゴリズムではありません。セキュリティ効果は非常に低く、その中核となる機能は、ASCII 文字しか使用できないものがあります。 Base64 は、非 ASCII 文字データを ASCII 文字に変換するために使用される方法であり、特に 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 には 2 つの static メソッド parseBase64Binary と printBase64Binary があります。これらは javax.xml.bind パッケージの下に隠されており、多くの開発者には知られていません。

Java 8 では、BASE64 エンコードおよびデコード API が java.util パッケージの下に実装されており、パフォーマンスが良く、API がシンプルで理解しやすいです。 以下にこのクラスの使用例を示します。

java.util.Base64

このクラスは、次の 3 つの 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のサードパーティ実装

1つ目は、一般的に使用されるApache Commons Codecライブラリのorg.apache.commons.codec.binary.Base64です。
2つ目は、Google Guavaライブラリです内部の静的メソッド com.google.common.io.BaseEncoding.base64()
3 番目のメソッドは net.iharder.Base64 で、この jar パッケージは単なる 1 つのクラスです
最後のメソッドは、最も高速なメソッドとして知られている MigBase64 Base64 エンコード速度、そして 10 年前にこのタイトルを維持できるかどうかは、テストしてみればわかります

Base64 エンコードのパフォーマンス テスト

上記は合計 7 種類の Base64 エンコードです。 , Jdk には 3 種類あり、最初の 3 種類の実装を選択したら、それらを比較する必要があります。 まず、2 つのインターフェイスの違いを定義します。インターフェイスは、インターフェイス メソッドのパラメーターがバイト配列を受け取り、バイト配列を返すため、byte->byte は String->byte または byte->String よりも高速であるため、テストでは 2 つのグループが区別されます

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 があり、深く隠されています。 java6.DatatypeConverter では、どちらも良い選択です。

以上がJava8 の新機能の解釈 -- Base64の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。