JavaでのBase64

java.util.Base64を使ったJavaでのBase64エンコード・デコード。Basic、URL-safe、MIMEの各エンコーダーの使い方と実践的なコード例を紹介します。

Language

詳細な説明

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つのエンコーダータイプ:

  1. BasicBase64.getEncoder()):行区切りなしの標準Base64。A-Z, a-z, 0-9, +, / と パディング用の = を使用。汎用的なエンコードに最適。

  2. URL-safeBase64.getUrlEncoder()):+ の代わりに -/ の代わりに _ を使用。行区切りなし。URLやファイル名に含めるデータのエンコードに理想的。

  3. MIMEBase64.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で、バイナリペイロードをエンコードする場合に使用します。

試してみる — Base64 Encoder

フルツールを開く