【Java進化史 第23回】Java8でBase64は何がどう変わったのか 〜 地味だが確かな進化 〜
風の噂で聞いた。
Java8でBase64が正式に追加されたらしい。
「いや、前からあっただろう?」
そう思った人も多いはずだ。
確かに、Java7以前でもBase64は使えていた。
// Java7以前(内部API)
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
// 内部実装。公式仕様ではない
BASE64Encoder encoder = new BASE64Encoder();
String encoded = encoder.encode("Hello".getBytes());
使えてはいた。
しかし、sun.* は内部API。
将来の保証はない。
そしてJava8で、正式APIが追加された。
■ Java8で追加されたBase64
import java.util.Base64;
String original = "Hello Java8";
// 通常のBase64エンコード
String encoded = Base64.getEncoder()
.encodeToString(original.getBytes());
// デコード
String decoded = new String(
Base64.getDecoder().decode(encoded)
);
java.util.Base64。
内部APIから、正式仕様へ。
これが最大の変化だ。
■ 何がどう変わったのか
① 内部API → 標準APIへ
- Java7以前:sun.misc(内部API)
- Java8以降:java.util.Base64(正式サポート)
安心して使える。
地味だが、これは大きい。
② 用途別に整理された
// 改行なし(一般的な用途)
Base64.getEncoder();
// URL安全(+ と / を置換)
Base64.getUrlEncoder();
// MIME形式(76文字ごとに改行)
Base64.getMimeEncoder();
以前は用途の区別が曖昧だった。
Java8では、意図がAPIに現れている。
③ 改行仕様が明確になった
- 通常Encoder:改行しない
- MIME Encoder:76文字ごとにCRLF改行
メール添付や一部仕様では、 この違いが重要になる。
④ 例外仕様が整理された
try {
Base64.getDecoder().decode("不正な文字列");
} catch (IllegalArgumentException e) {
// 不正なBase64文字列
}
decode時の挙動も明確だ。
■ 地味だが、いい進化
Java8はラムダやStreamが目立つ。
しかしその裏で、 こうした基盤の整備も行われていた。
派手ではない。
だが確実に実務を支える変更だ。
地味だが、いい進化だなぁと思う。