Java8のjava.util.Base64クラスでのgetEncoderとgetUrlEncoder,getDecoderとgetUrlDecoderの違い

Java8のjava.util.Base64クラスでのgetEncoderとgetUrlEncoder,getDecoderとgetUrlDecoderの違い

Java8からjava.util.Base64クラスを使ってエンコード&デコードが出来るようになりました。

Base64.getEncoder().encode("hoge".getBytes());

これでエンコードが出来ます。もう一つgetUrlEncoder()メソッドがあり、こちらもエンコードを行います。

Base64.getUrlEncoder().encode("hoge".getBytes());

getEncoderとgetUrlEncoderの違い

getEncoderとgetUrlEncoderの違いはUrl safeかどうかの違いです。

メソッド Urlセーフ
getEncoder ×
getUrlEncoder

Urlセーフの場合は、+が-に置換、/が_に置換されます。Urlアンセーフの場合は、+と/はそのまま使われます。

getDecoderとgetUrlDecoderの違いも同じです。

その為、エンコードした内容に+と/が含まれない場合に限り、getEncoderでエンコードしたのに対してgetUrlDecoderでデコードしても正常にデコードできてしまいます。

以下サンプルコードです。

package purejava;

import java.util.Base64;

public class Base64Smaple {
  public static void main(final String[] args) {
    String in = "hogefuga";
    var encodeData = Base64.getEncoder().encode(in.getBytes()); // エンコード
    System.out.println(encodeData); // バイト配列

    var decodeData1 = new String(Base64.getDecoder().decode(encodeData));
    System.out.println(decodeData1); // hogefuga

    var decodeData2 = new String(Base64.getUrlDecoder().decode(encodeData));
    System.out.println(decodeData2); // hogefuga 正常にデコードできる
  }
}

但しgetEncoderでエンコードした結果に+か/が含まれる場合、getUrlDecoderでデコードするとエラーになります。

getUrlEncoderでエンコードし、getDecoderでデコードする場合も同じくエラーになる可能性があります。(-と_が含まれる場合のみ)

以下getEncoderでエンコード、getUrlDecoderでデコードしてエラーとなるサンプルコードです。

package purejava;

import java.util.Base64;

public class Base64Smaple {

  public static void main(String[] args) {
    String in = "d!\"#$%&'()=~|";
    var encodeData = Base64.getEncoder().encode(in.getBytes()); // エンコード
    System.out.println(new String(encodeData)); // ZCEiIyQlJicoKT1+fA== プラスが含まれている

    var decodeData1 = new String(Base64.getUrlDecoder().decode(encodeData)); // 正常にデコードできない為、エラーとなる
    // java.lang.IllegalArgumentException: Illegal base64 character 2b
    System.out.println(decodeData1);
  }
}

上記ソースの12行目のデコードをgetDecoderに修正すれば正しくデコードできるようになります。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました