Java で Base64 エンコード/デコードを行う処理方法の選択について

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では Java 言語で Base64 エンコード/デコード処理を行う方法の選択について解説したいと思います。 処理方法の比較検討の参考になれば幸いです。

Base64 処理のためのいくつかの方法

 Java で Base64 のエンコード/デコード処理を行う場合、選択肢として次のようないくつかのライブラリ/クラスが候補にあります。

  • Apache Commons Codec を利用する
  • JavaMail の MimeUtility を利用する
  • Seasar2 の Base64Util を利用する
  • Java 8 で追加された Base64 クラスを利用する

 Java 7 までは標準クラスの中に Base64 を処理するためのクラスが含まれていませんので、上記のようなライブラリを利用する必要があります。 しかし Java 8 からは標準クラスに Base64 クラスが追加されました。 本稿では、それぞれの方法について特徴やメリットについて解説します。

 ただし上記の方法とは逆に、筆者が利用しない方が良いと考える Base64 クラスがあります。 次のように com.sun や sun.misc などで始まるパッケージに属するクラスです。 名前の通り Sun が Java を開発していた時の名残で、機能としては問題なく動くと思ういますが、Sun 製以外の Java の環境で動かない場合があるかもしれない為、筆者は利用しないようにしています。

  • sun.misc.BASE64Encoder
  • com.sun.org.apache.xerces.internal.impl.dv.util.Base64
  • com.sun.org.apache.xml.internal.security.utils.Base64
  • com.sun.xml.internal.messaging.saaj.util.Base64
  • com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream
  • com.sun.xml.internal.ws.util.Base64Util

Apache Commons Codec を利用する

 上記の通り Java 7 までは標準の Java に Base64 を扱うクラスがありませんでしたので、Apache Commons Codec を利用するのが一番一般的な方法だったのではないかと思います。 Base64 の処理を行ってくれるクラスは org.apache.commons.codec.binary.Base64 です。 開発は The Apache Software Foundation で行われていますので、今後のサポートもある程度安心だと思います。 2015年01月現在、バージョン 1.10 が最新で、過去のバージョンでは Base64 文字列中に適切な間隔で改行を入れる Base64 の仕様に対応していない事がありましたが、現在では対応しています。

 Apache Commons Codec での Base64 処理については、別稿「Apache Commons Codec で Base64 処理を行う 」で詳しく解説していますので、そちらも参考にしてください。

ownCloud

Apache Commons Codec で Base64 処理を行う

JavaMail の MimeUtility を利用する

 Java でメールを送信するためのライブラリ JavaMail の中にある MimeUtility クラスを利用しても Base64 の処理を行えます。 但し上記の Apache Commons Codec がバージョンアップして高機能化している為、現在は JavaMail の MimeUtility を敢えて利用する必要はないと感じています。 敢えて利用するとしたら「既存機能や他機能の制約により最新版の Apache Commmons Codec を利用できない」ような理由から別の Base64 処理クラスを利用したい場合です。 上記の通り、古い Apache Commons Codec には適切な間隔で改行を入れる機能が備わっていない為、その仕様の Base64 処理をしたい場合には JavaMail の MineUtility を使う事があります。

Seasar2 の Base64Util を利用する

 プロジェクトでフレームワークとして Seasar2 を採用している場合は、S2Container に含まれる Base64Util クラスを利用しても良いかもしれません。 ただ Javadoc を見て分かる通り、特に多くのオプションを提供している訳でもありません。 最新の Apache Commons Codec を利用できるのであれば、そちらを利用すれば良いと思います。

Java 8 で追加された Base64 クラスを利用する

 Java8 から Base64 クラスが追加されたので、Java 8 を利用した開発プロジェクトであれば、この標準クラスを利用するのが良いでしょう。 RFC4648 の標準 Base64 エンコーディング, RFC4648 の Base64 URLエンコーディング、RFC2045 MIME の Base64エンコーディング に対応しているので、利便性がとても高いです。

所感

 以上、Base64 処理を行ういくつかの方法について解説しましたが、2015年01月時点での私の所感は「Java 8 のプロジェクトであれば Java 8 の Base64 クラスを利用する。 Java 8 以下のプロジェクトであれば Apache Commmons Codec を利用するのが良い」です。 各々のプロジェクトで最適な Base64 処理を行えるように、頭の片隅で覚えておこうと思います。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca