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

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

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

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

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 正常にデコードできる
}
}

view raw
Base64Smaple.java
hosted with ❤ by GitHub

但し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);
}
}

view raw
Base64Smaple.java
hosted with ❤ by GitHub

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

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA