はじめに
業務で担当していたPowerShellのコードに「文字列をBase64に変換している処理」があったので、JavaでBase64にエンコードする方法と、Base64からデコードする方法を調べてみました。
コード
基本的な変換処理
- Base64にエンコード/デコードするためのクラスは、
Base64.Encoder
とBase64.Decoder
に分かれていました。- これらのクラスは、いずれもJava8で実装されたそうです。
- APIのページを見る限り、
Base64.Encoder
とBase64.Decoder
のコンストラクタを直接呼び出すことはできません。- そのため、
Base64
クラスからgetEncoder()
メソッドとgetDecorder()
メソッドを呼び出してこれらのクラスのインスタンスを作ります。
- そのため、
- 単にエンコードするだけであれば
encode()
を使いますが、ここでは結果を文字列として受け取りたかったのでencodeToString()
を使っています。
Base64Sample
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Sample {
public static void main(String[] args) {
String txt = "nkojimaです";
System.out.println("オリジナルの文字列:" + txt);
// エンコード
Base64.Encoder encoder = Base64.getEncoder();
String encoded = encoder.encodeToString(txt.getBytes(StandardCharsets.UTF_8));
System.out.println("エンコードした文字列:" + encoded);
// デコード
Base64.Decoder decoder = Base64.getDecoder();
String decoded = new String(decoder.decode(encoded.getBytes(StandardCharsets.UTF_8)));
System.out.println("デコードした文字列:" + decoded);
}
}
実行結果
オリジナルの文字列:nkojimaです
エンコードした文字列:bmtvamltYeOBp+OBmQ==
デコードした文字列:nkojimaです
URLやファイル名をエンコード/デコードする場合
- URLやファイル名をBase64エンコード/デコードする時は、
Base64.getUrlEncoder()
およびBase64.getUrlDecoder()
を利用します。
補足:スレッドセーフについて
-
Base64.Encoder
クラスとBase64.Decoder
クラスのAPIのページを見ると、これらのインスタンスはともに「複数のスレッドで並行して使用できます」と書かれていました。