Javaプログラマー資格試験(OCJ-P) WEB講座 -9ページ目

Javaプログラマー資格試験(OCJ-P) WEB講座

Javaプログラマー資格(OCJ-P)を学習するブログです。

OCJ-P・Javaプログラマー資格をとりたい。
Javaプログラミングの入門者・初心者。

そんなあなたに、Javaプログラマー資格の取得に役立つ本質的な知識を、
分かりやすく解説していきます。

 Serializeクラスを用いた直列化について勉強します。
その前に理解しておきたいことは、
ファイル入出力について。

Serializeもほとんどファイル入出力と似たような流れなので、
ファイル入出力で使うクラスを理解できていれば、
直感的に理解しやすいですよ。

私の感覚では、直列化=オブジェクトをファイルに読み書きすること。
例えば、
コマンドラインでユーザーが入力したファイルを書き出すこと。
= 生成したオブジェクトをシリアライズすること。
概念的に同じです。

要は、情報を保存するということですね。
そして保存した情報を復元するということ。

なので、もしあなたがSerializeって何?
と、もし首を傾げていたら、
まずはSerializeは情報を保存すること。だと覚えて下さい。
何の情報?それは、オブジェクト(インスタンス)の情報です。

 当サイトのファイル入出力の解説は↓↓こちらからです。
 ファイルの入出力 Readerクラスと Writerクラス
 勉強していて分からない点があります。
あるクラスのインスタンスを生成するときに、
そのクラス型ではなくて、上位クラスの型でもつことがあります。

例えば、List型のサンプルでよく見る、
List<String> list = new ArrayList<String>(); や、
Map map = new HashMap(); など。

このとき、listはArrayListのメソッドを使えるし、
mapはHashMapのメソッドを使えます。

しかし・・・
なぜ、上位クラスの型でインスタンスを生成するのでしょうか?
今一番、大きな謎です。

 
 これはポリモーフィズムという、
オブジェクト指向の代表例みたいですね。

業界用語で説明すると、
サブクラスの参照をスーパークラスの参照型変数に格納できる機能。

オブジェクト指向の基本的な機能みたいですね。
私は今日このことを調べていたので、
Sun時代のJavaプログラマー資格(SCJ-P)を持っている、
職場の同僚に質問したところ、
・・・?という答えが返って来ました。

多くのプログラマーが、
そういう状態ではなかろうかと想像します。
それでは応用が効きません。

本講座の読者のあたなは、
本質的なところまでしっかり理解して、
価値の高い人材になりましょうね^^
 なかなかクラスの説明に入れず申し訳ありません。
いよいよJavaにおけるファイル入出力の基本パターンです。

ファイルの入出力というからには、
入力と出力があります。
分かりやすく言うと、読み込みと書き込みです。

ここではまず、読み込みについて解説します。
読み込み系のクラスは沢山あります。

Readerクラス
InputStreamReaderクラス
FileReaderクラス
InputStreamクラス
FileInputStreamクラス
BufferedReaderクラス
BufferedInputStream
はっきり言って、謎です。

解説書やWebサイトによっていろんなのが使われていて、
おおよそ7種類ぐらい出てきます。
しかし、いきなり7種類ものクラスを区別するのは無理です。

 私は研究の結果、7つのクラスを区別する、
重要な質問が2つあるということを見出しまし。

1.ファイルをバイナリとして読み込むのか、テキストとして読み込むのか?
2.一文字ずつ読み込むのか、一行ずつまとめて読み込むのか?
ということです。

ここでは一旦バイナリ形式やテキスト形式ということは置いておいて、
まず、それぞれの答えに応じて、7つのクラスを分類しましょう。

1.
バイナリとして読み込む
InputStream(abstract)
FileInputStream

テキストとして読み込む
Reader(abstract)
   └ InputStreamReader
       └FileReader   ・・・文字コードの指定などが不要な一番便利なクラス。

ここまでで5つのクラスが出てきました。

2.の質問は、効率よく読み込みたいですか?
という質問と同じ意味を持っています。

2.
一文字ずつ読み込む
Buffered○○クラスは使わなくて良い。

一行ずつまとめて読み込む=効率よく読み込む
ここで1.のバイナリかテキストかが登場します。

バイナリとして読み込む BufferedInputStream コンストラクタの引数は InputStream型
テキストとして読み込む BufferedReader    コンストラクタの引数は Reader型 

ということで、7つのクラスを分類することができました。
読み込み系クラスがいろいろ出すぎて頭がごっちゃになったら、
上記の2つの質問を投げかけて整理してみてください。

詳しい使い方は後の記事で解説します。