9.入出力とパッケージ2007.04.18 株式会社四次元データ 西谷太郎 この章では、外部のファイルを読み込む機能と、パッケージという仕組みについて説明します。ここではCSVファイルのプログラム内で扱える形での読み込みと、java.ioパッケージのクラスの利用を通して学びます。9.1. 入出力さてここでは、外部ファイルを読み込む→そこからHumanインスタンスのフィールドに与える値を得る→Humanインスタンスに設定する、という流れで解説していくわけですが、まだ私たちはその「外部ファイル」なるものを用意していません。
TaroYamada,32
JiroSato,54
HanakoIto,28
三人分の個人情報が書かれていることがお分かりでしょうか?名前や年齢を変えたり人を増減させるのは構いません。ここでの決め事は、名前,年齢の順でデータが並んでおり、各行が一人の人間を表している、ということです。ファイル名はmember.csvとします。 Javaではデータの入出力はストリーム(Stream、流れ)という概念で行われます。大体において、ストリームを開く→データがなくなるまで読み込み/書き込みを行う→ストリームを閉じる、という手順で行われます。
import java.io.FileReader;
import java.io.BufferedReader;
public class CSVReader{
public static void main(String[] args){
FileReader reader = new FileReader("member.csv");
BufferedReader br = new BufferedReader(reader);
// ここに処理を記述
br.close();
}
}
冒頭のimport ○○○;の部分は、一種のおまじないです。例えばこのCSVReaderクラスでは、java.io.FileReader というクラスを利用しますという宣言です。この宣言なしに、例えば、 java.io.FileReader reader = new java.io.FileReader("member.csv");
のように完全限定名でクラスを記述することもできるのですが、あまり読みやすいとは言えません。そこで、冒頭で CSVReader クラスで利用している外部のクラスを宣言しておくわけです。mainメソッドの最初で、FileReader型の変数readerを作り、"member.csv"を引数にとったFileReaderのオブジェクトを作り、readerにその参照値を代入しています。このreaderをすぐにBufferedReaderに、読み込みのスピードを上げるためです。 FileReaderではread()などのメソッドでファイルの内容を呼び出すたびにファイルにアクセスしますが、BufferedReaderをかませることで、一度に一定量を読み込んでおいて、逐次そこからデータを取り出す、という形をとります。文字ストリームは行ごとにまとめて処理するのが一般的です。 この二行を、
BufferedReader br = new BufferedReader(new FileReader("member.csv");
と、まとめることも出来ます。 9.2. パッケージ
プログラムをたくさん書いていると、だんだんと管理が大変になってきます。こういう時には普通、フォルダを使ってファイルを整理しますね?Javaでもを同じようにプログラムを整理します。但しJavaの世界では、フォルダの代わりにパッケージを使います。
+-java
+-packageA
-test.class
+-packageB
-test.class
この様にパッケージ分けをすればtest.classという名前がかぶっても大丈夫ですね。さてパッケージを使うには具体的にどうするのでしょうか。
package introduction;
と、記述することになります。ここでは、HumanとCSVReaderです。(必要ならStudentにも) また、他のパッケージのからクラスファイルを参照するときには、完全限定名(Fully Qualified Name)を使います。そのファイルを含んでいるパッケージをすべて記述します。上記のtestファイルだと、java.packageA.testとか、java.packageB.testのようにピリオド(".")で区切って上の階層のパッケージから順に中に入っていきます。
java.io.FileReader reader = new java.io.FileReader("member.csv");
java.io.BufferedReader br = new java.io.BufferedReader(reader);
の様に記述しなければなりません。が、毎度毎度これを全部書くのはプログラムが大きくなればなるほど大変な手間です。そこで、import文を使ってこの記述を省略する方法が提唱されています。使い方は、パッケージ指定の後に、
import ○○.○○....;
import java.io.FileReader;
import java.io.BufferedReader;
の様に記述します。一度記述すると、それ以降ここでインポートしたクラスは完全限定名で指定しなくても使うことができます。また、
import java.io.*;
の様に記述すると、java.io内のクラスファイルをすべて使うことができるようになります。ただしこの方法はどのクラスを使用するのかが分かりにくくなるため、あまり推奨されていません。
import java.packageA.test
import java.packageB.test
の様にしてtestを利用することは出来ず、少なくとも一方は諦めて完全限定名で使用することになります。 |
![]()
![]()
|