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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント