「何をいまさら」な感じの機能追加だけど、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 Codec の Base64 クラス を使うことが一般的だったぽいので、それとの性能比較をしてみた。
今回は、メソッド呼び出しにおけるオーバーヘッドを見るスイート (上段) と、Base64 の変換処理の性能を見るスイート (下段) の二種類を用意した。
この結果から、
- 全般的に、Java 8 で導入された Base64 クラスの方が処理性能的に優れている
- 特に、Java 8 側の変換メソッドを呼び出す際のオーバーヘッドが Commons Codec のそれより明らかに小さいことがわかる
- 変換処理の性能は、エンコーディングが 6 倍程度、デコーディングが 2 倍ちょっと、Java 8 の Base64 クラスの方が速い
ということがわかるかと思う。
なお、性能測定に用いたプログラムは以下のとおり。
まとめ
- Base64 だけについて言えば、Commons Codec はその役目を終えた感がある
- これからは Java 8 の Base64 を積極的に使うのがよさそうだね!
Greetings! Very helpful advice within this article!
返信削除It is the little changes that make the greatest changes. Thanks a lot
for sharing! 토토