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に修正すれば正しくデコードできるようになります。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^

コメント