Categories: Java

【Java入門】Base64エンコード・デコードする方法

Java

// Base64エンコードしたい文字列を定義
String target = "りんごapple林檎";

// 文字列をBase64エンコードする
String result = Base64.getEncoder().encodeToString(target.getBytes());

// 結果を出力
System.out.println(result);

結果は以下のとおりです。これがりんごapple林檎という文字列をBase64変換した値になります。

Java

44KK44KT44GUYXBwbGXmnpfmqo4=

文字列をBase64エンコードしてファイルに書き込む

以下の例は、りんごapple林檎という文字列をBase64変換してファイルに書き込むコードです。
ファイルに書き込む際はBase64変換した値をbyte配列で保持しておく必要があるのでencodeメソッドを使用します。

Java

// 書き込み先パス
String outPutFilePath = "C:\\workspace\\result\\test.txt";

// Base64エンコードしたい文字列を定義
String target = "りんごapple林檎";

// 文字列をBase64エンコードする
byte[] result = Base64.getEncoder().encode(target.getBytes());

// エンコードした値をファイル出力
try(FileOutputStream fos = new FileOutputStream(outPutFilePath);
    BufferedOutputStream bos = new BufferedOutputStream(fos);){
    bos.write(result);
}

結果は以下のとおりです。
catコマンドでファイルの中身を表示しています。

Linuxコマンド

$ cat test.txt
44KK44KT44GUYXBwbGXmnpfmqo4=

文字列をBase64デコードする

以下の例は、Base64デコードして、元の文字列を取り出すコードです。 エンコードしたときにようにいきなりString型で受け取るメソッドは存在しないので、一旦byte配列で受け取る必要があります。

Java

// Base64デコードしたい文字列を定義
String target = "44KK44KT44GUYXBwbGXmnpfmqo4=";

// 文字列をBase64デコードする
byte[] decodedStr = Base64.getDecoder().decode(target);

// 結果を出力
System.out.println(new String(decodedStr));

結果は以下のとおりです。

Java

りんごapple林檎

文字列をBase64デコードしてファイルに出力する

以下の例は、Base64デコードして、元の文字列を取り出してファイル出力するコードです。 以下の例ではファイルに書き込む際にsjisを指定していますが、UTF-8等も可能です。

Java

// 書き込み先パス
String outPutFilePath = "C:\\workspace\\result\\test.txt";

// Base64デコードしたい文字列を定義
String target = "44KK44KT44GUYXBwbGXmnpfmqo4=";

// 文字列をBase64デコードする
byte[] decodedStr = Base64.getDecoder().decode(target);

// デコードした値をファイル出力
try(FileOutputStream fos = new FileOutputStream(outPutFilePath);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    OutputStreamWriter osw = new OutputStreamWriter(bos, "sjis");){
    osw.write(new String(decodedStr));
}

結果は以下のとおりです。
catコマンドでファイルの中身を表示しています。

Linuxコマンド

$ cat test.txt
りんごapple林檎

任意のファイルをBase64エンコードする

sample.txtというファイルを用意しました。ファイルの中身は以下です。これをBase64エンコードしてみます。

Linuxコマンド

$ cat sample.txt
apple
りんご
林檎

Javaコードは以下のとおりです。

Java

// Base64エンコードしたいファイルのパス
String targetFilePath = "C:\\workspace\\result\\sample.txt";

// ファイルの内容をbyteに変換する
byte[] data = Files.readAllBytes(Paths.get(targetFilePath));

// Base64エンコードする
String base64str = Base64.getEncoder().encodeToString(data);

// 結果を出力
System.out.println(base64str);

結果は以下のとおりです。これがsample.txtというファイルをBase64変換した値になります。
このやり方だとテキストファイルに限らずzipファイルもBase64エンコードすることができます。

Java

YXBwbGUNCoLogvGCsg0Kl9GM5w==

Base64デコードしてファイルを復元する

以下は、Base64エンコード済みのファイルをデコードして元のファイルに戻すコードです。

Base64文字列がSJISの場合

Base64エンコードしたときの元のファイルがSJISの場合は、復元する場合もSJISにする必要があります。

Java

// 書き込み先パス
String outPutFilePath = "C:\\workspace\\result\\result.txt";

// Base64文字列(SJIS)
String base54Str = "YXBwbGUNCoLogvGCsg0Kl9GM5w==";

// デコードしてbyteに変換する
byte[] decodedStr = Base64.getDecoder().decode(base54Str);

// SJISでファイル出力
try(FileOutputStream fos = new FileOutputStream(outPutFilePath);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    OutputStreamWriter osw = new OutputStreamWriter(bos, "Shift-JIS");){
    osw .write(new String(decodedStr, "Shift-JIS"));
}

結果は以下のとおりです。ファイルはSJISで作成されているはずです。

Linuxコマンド

$ cat result.txt
apple
りんご
林檎

SJISのBase64文字列でUTF-8のファイルを作りたい場合

以下のようにOutputStreamWriterUTF-8を指定すればOKです。

OutputStreamWriter osw = new OutputStreamWriter(bos, "UTF-8");

ただし、この場合でもBase64文字列自体はSJISで保持しているわけなので、以下はSJISのまま変更してはいけません。

osw.write(new String(decodedStr, "SJIS"));

Base64文字列がUTF-8の場合

Base64エンコードしたときの元のファイルがUTF-8の場合は、復元する場合もUTF-8にする必要があります。

Java

// 書き込み先パス
String outPutFilePath = "C:\\workspace\\result\\result.txt";

// Base64文字列(UTF-8)
String base54Str = "YXBwbGUK44KK44KT44GUCuael+aqjg==";

// デコードしてbyteに変換する
byte[] decodedStr = Base64.getDecoder().decode(base54Str);

// UTF-8でファイル出力
try(FileOutputStream fos = new FileOutputStream(outPutFilePath);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    OutputStreamWriter osw = new OutputStreamWriter(bos, "UTF-8");){
    osw .write(new String(decodedStr, "UTF-8"));
}

結果は以下のとおりです。ファイルはUTF-8で作成されているはずです。

Linuxコマンド

$ cat result.txt
apple
りんご
林檎

UTF-8のBase64文字列でSJISのファイルを作りたい場合

以下のようにOutputStreamWriterSJISを指定すればOKです。

OutputStreamWriter osw = new OutputStreamWriter(bos, "SJIS");

ただし、この場合でもBase64文字列自体はUTF-8で保持しているわけなので、以下はUTF-8のまま変更してはいけません。

osw.write(new String(decodedStr, "UTF-8"));

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

issiki_wp