コンテンツへスキップ
ナビゲーションに移動
- ファイル出力
- 「ラップする」とは
- ファイルへ文字を出力する時、直接的にはBufferedWriterを使用する。
それは、バッファリング機能で効率よく出力でき、1行分ずつ出力できるメソッドがあるなど使いやすいからである。
しかし、BufferedWriterにはファイルへ文字を書く能力がないので、その処理をFileWriterに処理をまかせる。
(バッファにデータが溜まったところを見計らい、FileWriterに送って一度に処理を依頼する。)
- オブジェクトレベルで考えると
BufferedWriterはフィールドにFileWriterの参照を持つ。これにより必要な時FileWriterの出力メソッドを使用することができる。
このように、他のオブジェクトの参照を内部に持つことHAS-A関係という。
HAS-A関係ではそのオブジェクトの機能を自分のもののように使うことができる。
- 入出力は、一般的にチェック例外が発生する。多くは、IOException
- 最後は、必ず、closeメソッドを忘れないようにする。
closeしないと、メモリー上のバッファにデータが残ったままになる。システムの資源を解放するという点からも必ず実行すること。
- ファイル入力
- ファイルからデータを読み出すためには、FileReaderとBufferedReaderを使用する
- readLineメソッドを使うと1行単にで読みだすことができる。
- 最後は、必ずcloseメソッドを使用すること。
- 直列化(シリアライズ)と直列化復元(デシリアライズ)
- 直列化
オブジェクトをファイルなどに出力して保存すること
- 直列化復元
シリアライズで記録したファイルの内容を読みとってオブジェクトを元通り復元すること
- オブジェクトのある時点での状態をまるごと保存するので、スレッドやOSに依存するクラスなど、直列化できないクラスも存在する。
直列化可能なクラスはSerializableインタフェースを実装しなければならない。
- オブジェクトグラフの自動保存
- Javaの直列化機構は、クラスがSerializableインタフェースを実装していれば、参照とオブジェクトの連鎖(オブジェクトグラフ)を追跡して、必要なオブジェクトをすべて自動保存してくれる。
- 直列化復元では、同時に保存されているオブジェクトをすべて復元する。
- ただし、オブジェクトグラフに加わることができるのは、Serializableインタフェースを実装しているクラスだけである。
そのため標準クラスのほとんどがSerializableインタフェースを最初から実装して、オブジェクトグラフに加われるようになっている。
- transient修飾子
- transient修飾子を付けた変数は、直列化から除外される。
(これにより、クラスの残りの部分を直列化することができる。)
- 直列化から除外されたフィールドは、型の直列化復元時に規定値で初期化される。
- コンストラクタでは初期化は実行されない。
- 継承と直列化
- 親クラスがSerializableインタフェースを実装していれば、サブクラスは特に実装しなくても暗黙の内にSerializableインタフェースを実装していることなる。
(明示的に実装する必要はない)
- サブクラスだけがSerializableインタフェースを実装し、スーパークラスが実装していない場合でもサブクラスだけを直列化することができる。
ただし、スーパークラスから引き継いだフィールドはすべてコンストラクタによりデフォルトに初期化される。
- 直列化復元では、通常コンストラクタは起動しないが、Serilizableを実装していない親クラスから引き継いだ部分については、コンストラクタが起動して初期化を行う。
- staticをつけて宣言したクラス変数は直列化の対象にならない。
PAGE TOP