JavaでのBase64
java.util.Base64を使ったJavaでのBase64エンコード・デコード。Basic、URL-safe、MIMEの各エンコーダーの使い方と実践的なコード例を紹介します。
詳細な説明
Java 8で java.util.Base64 クラスが導入され、用途別に3つのエンコーダー/デコーダーのペアが提供されています:Basic、URL-safe、MIMEです。Java 8以前は、公開APIではない sun.misc.BASE64Encoder やApache Commons Codecなどのサードパーティライブラリに頼る必要がありました。
基本的なエンコードとデコード:
import java.util.Base64;
// Encoding
String original = "Hello, World!";
String encoded = Base64.getEncoder().encodeToString(original.getBytes("UTF-8"));
// Result: "SGVsbG8sIFdvcmxkIQ=="
// Decoding
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes, "UTF-8");
// Result: "Hello, World!"
3つのエンコーダータイプ:
Basic(
Base64.getEncoder()):行区切りなしの標準Base64。A-Z, a-z, 0-9, +, / と パディング用の = を使用。汎用的なエンコードに最適。URL-safe(
Base64.getUrlEncoder()):+の代わりに-、/の代わりに_を使用。行区切りなし。URLやファイル名に含めるデータのエンコードに理想的。MIME(
Base64.getMimeEncoder()):76文字ごとに行区切り(\r\n)を挿入。MIME(RFC 2045)が要求する形式。メール添付ファイルなどのプロトコルで使用。
// URL-safe encoding
String urlSafe = Base64.getUrlEncoder().encodeToString(data);
// MIME encoding with line breaks
String mimeEncoded = Base64.getMimeEncoder().encodeToString(largeData);
// Without padding (useful for JWTs)
String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data);
大容量データのストリーミング処理:
// Wrap an OutputStream for encoding on-the-fly
OutputStream encodedStream = Base64.getEncoder().wrap(outputStream);
encodedStream.write(largeByteArray);
encodedStream.close();
wrap() メソッドは、ファイル全体をメモリに読み込む必要がないため、大きなファイルに特に有用です。データをストリームとして処理するため、数ギガバイトのファイルにも対応できます。
よくある間違い: 文字セットを指定せずに String.getBytes() を使用すること。デフォルトの文字セットはプラットフォームによって異なり(Linux/macOSではUTF-8、古いWindowsではWindows-1252)、同じ文字列でもマシンによって異なるBase64出力が生成される可能性があります。常に "UTF-8" を明示的に指定しましょう。
ユースケース
すべてのデータフィールドがXML内のASCIIセーフ文字列である必要があるレガシーシステムと通信するSpring Boot REST APIで、バイナリペイロードをエンコードする場合に使用します。