youtubeでリクエストいただいたので、まずはこちらにソースを作ってみました。
リクエストありがとうございます。動画のほうは・・すみません。少しお時間ください。
何かリクエストございましたらyoutubeのコメント欄へぜひどうぞ。
(時間かかるかもだけど・・)
サンプル
オブジェクトをシリアライズ(直列化)して、ファイルに保存&ファイルからオブジェクトを復元します。
コピペで使いやすいように大きく2つに分けてあります。
ライブラリ側 – オブジェクトのシリアライズをするクラス
こっちはライブラリ側です。
ファイル名と保存したいオブジェクトをもらって、ファイルに書き込み。
ファイル名をもらって、ファイルを読み込み、オブジェクトを復元します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeUtil { /** * オブジェクトの書き込み * @param fileName 保存先のファイル名(パスもつける) * @param o 保存するオブジェクト * @throws IOException 書き込み時の例外 */ public static void save(String fileName, Object o) throws IOException { //ファイルの書き込み準備 try(FileOutputStream fos = new FileOutputStream(fileName); ObjectOutputStream oos = new ObjectOutputStream(fos)) { //オブジェクトの書き込み(シリアライズ) oos.writeObject(o); oos.flush(); } } /** * オブジェクトの読み込み * @param fileName 保存したファイル名 * @return 読み込んだオブジェクト * @throws IOException 読み込み時の例外 * @throws ClassNotFoundException オブジェクトのクラスが見つからない時の例外 */ public static Object load(String fileName) throws IOException, ClassNotFoundException { //ファイルの読み込み準備 try(FileInputStream fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis)){ //オブジェクトの読み込み(デシリアライズ) return ois.readObject(); } } } |
シリアライズするオブジェクトとライブラリを使う側のクラス
こっちは上のライブラリを使う側のクラスです。
このサンプルでは、格納用にSaveDataクラスなるものを作って、これをファイルへ保存、その後ファイルからオブジェクトを復元しています。
保存するクラスはもちろん別のものでも構いませんが、対象のクラスにはjava.io.Serializableを必ず実装してください。
ただ実装といっても、このサンプルのとおり特別な記述はしなくて大丈夫です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; public class PersistenceTest { private static final String FILE_NAME = "c:\\work\\test.dat"; public static void main(String[] args) { try { // //データの保存 // //保存データを用意 SaveData writeData = new SaveData(1, "データ1", new Date(), 3); //これから保存するデータを出力 System.out.println("-- 保存データ --"); System.out.println(writeData); //保存データをシリアライズしてファイルへ書き込む SerializeUtil.save(FILE_NAME, writeData); // //データの復元 // //ファイルに保存したデータを読み込む SaveData readData = (SaveData)SerializeUtil.load(FILE_NAME); //復元した保存データを出力 System.out.println("-- 復元データ --"); System.out.println(readData); } catch (Exception e) { e.printStackTrace(); } } } /* 保存するサンプルのクラス */ class SaveData implements Serializable { //保存したいネタ private int id = -1; private String name = null; private Date date = null; private int stage = -1; public SaveData(int id, String name, Date date, int stage) { this.id = id; this.name = name; this.date = date; this.stage = stage; } /** * デバッグ出力用 */ @Override public String toString() { return "id:" + id + System.lineSeparator() + "name:" + name + System.lineSeparator() + "date:" + new SimpleDateFormat("yy/MM/dd HH:mm").format(date) + System.lineSeparator() + "stage:" + stage + System.lineSeparator(); } } |
実行結果
ファイルへ保存する前にSaveDataクラスの中身を出力。
ファイルへ保存&ファイルから復元のあとに、復元したオブジェクトの中身を出力しています。
1 2 3 4 5 6 7 8 9 10 11 | -- 保存データ -- id:1 name:データ1 date:23/03/26 18:29 stage:3 -- 復元データ -- id:1 name:データ1 date:23/03/26 18:29 stage:3 |
ちゃんと復元できてますね。
サンプルの解説
java.io.Serializableインタフェースを実装すると、オブジェクトのシリアライズ(直列化)が可能になります。
ObjectOutputStreamでファイルに保存(シリアライズ)。保存したファイルは、ObjectInputStreamを使うと復元できます。
保存したファイルを開いてみるとわかりますが、データはバイナリ形式で保存されます。
中身を見せたくないようなものには、向いているのではないでしょうか。
ちなみに、シリアライズとは、ざっくり言うと、そのオブジェクトが「01010111000・・・」のビットで表現できる状態にすることです。
このサンプルでは、シリアライズしているのは1つのオブジェクトですが、複数のオブジェクトを1つのファイルにまとめて書き込むこともできます。