2014-09-11

Java 8 で Base64 エンコーディング機能が導入されたらしいので使ってみた

Posted on 2014-09-11, 1:38 in

「何をいまさら」な感じの機能追加だけど、Java 8 から 標準のクラスライブラリで Base64 エンコーディング できるようになった。これはこれで嬉しいことなので、使い方とそのパフォーマンスをメモっておく。

使い方

まずはデモコードから。

エンコーダは以下のメソッド呼び出しで得られる 3 つの種類がある。

  • Base64.getEncoder()
  • Base64.getUrlEncoder()
  • Base64.getMimeEncoder()

対応するデコーダがそれぞれ用意されている。

  • Base64.getDecoder()
  • Base64.getUrlDecoder()
  • Base64.getMimeDecoder()

Base64.getUrlEncoder() で得られるエンコード文字列は、普通の Base64 エンコーディングではファイルパスや URI での利用時に問題となりうる +/ の文字の代わりに -_ を使ってエンコードしてくれる。「Base64 エンコーディングした文字列をファイル名に利用したい!」みたいなケースだととっても有用だと思う。

パフォーマンス

Java 7 以前は Apache Commons CodecBase64 クラス を使うことが一般的だったぽいので、それとの性能比較をしてみた。

今回は、メソッド呼び出しにおけるオーバーヘッドを見るスイート (上段) と、Base64 の変換処理の性能を見るスイート (下段) の二種類を用意した。

この結果から、

  • 全般的に、Java 8 で導入された Base64 クラスの方が処理性能的に優れている
  • 特に、Java 8 側の変換メソッドを呼び出す際のオーバーヘッドが Commons Codec のそれより明らかに小さいことがわかる
  • 変換処理の性能は、エンコーディングが 6 倍程度、デコーディングが 2 倍ちょっと、Java 8 の Base64 クラスの方が速い

ということがわかるかと思う。

なお、性能測定に用いたプログラムは以下のとおり。

まとめ

  • Base64 だけについて言えば、Commons Codec はその役目を終えた感がある
  • これからは Java 8 の Base64 を積極的に使うのがよさそうだね!

1 件のコメント

  1. Greetings! Very helpful advice within this article!
    It is the little changes that make the greatest changes. Thanks a lot
    for sharing! 토토

    返信削除