Previous | Next | Trail Map | Writing Java Programs | 入出力ストリーム


DataInputStream と DataOutputStream の使用

このページでは、java.io のDataInputStream と DataOutputStream のクラスの使用方法を示す。 例として DataIOTest を起用し、表データ(Java 商品の送り状)の読み込みや書き込みを行う。 表データは列でフォーマットされていて、それぞれの列はタブによって区別される。 列には次のようにセールス価格、注文されたユニット数と項目の説明が入っている。

19.99   12      Java T-shirt
9.99    8       Java Mug

DataOutputStream は他のフィルタ出力ストリームのように、他の OutputStream に接続されていなければならない。 この場合、 invoice1.txt という名前のファイルに書き込むために設定された FileOutputStream に付加される。

DataOutputStream dos = new DataOutputStream(
                           new FileOutputStream("invoice1.txt"));

次に、DataIOTest は,DataOutputStream のデータ毎に用意した専用の writeXXX()メソッドを使用して、(プログラムの配列内に含まれている)送り状データをそのデータの型に合わせて作成する。

for (int i = 0; i < prices.length; i ++) {
    dos.writeDouble(prices[i]);
    dos.writeChar('¥t');
    dos.writeInt(units[i]);
    dos.writeChar('¥t');
    dos.writeChars(descs[i]);
    dos.writeChar('¥n');
}
dos.close();

この例では、処理が終了すると出力ストリームを閉じていることに注意する。

また、DataIOTest は,ファイル名を記述するだけで、そのファイル上に DataInputStream を開く。

DataInputStream dis = new DataInputStream(
                          new FileInputStream("invoice1.txt"));

DataInputStream も同様に他の InputStream に接続されなければならない。 この例では、 invoice1.txt ファイルを読み込むために設定された FileInputStream に接続される。 DataIOTest は DataInputStream のデータ毎に用意した専用のreadXXX() メソッドを使用して、データを読み返す。

try {
    while (true) {
        price = dis.readDouble();
        dis.readChar();       // tabを捨てる
        unit = dis.readInt();
        dis.readChar();       // tabを捨てる 
        desc = dis.readLine();
        System.out.println("You've ordered " + unit + " units of " + desc + " at $" + price);
        total = total + unit * price;
    }    
} catch (EOFException e) {
}
System.out.println("For a TOTAL of: $" + total);
dis.close();

すべてのデータが読み取られると、DataIOTest は注文と合計金額をまとめた文を表示してストリームを閉じる。

DataIOTest が DataInputStream からデータを読むために使用するループに注意すること。 通常、読み取り特には,次のようなループが使用される。

while ((input = dis.readLine()) != null) {
    . . .
}

readLine() メソッドは値、 null を返し、ファイルの終りに達したことを表す。 ファイルの終わりを示すために返される値はストリームから読み込まれた正当な値と区別ができないので、DataInputStreamの readXXX() メソッドの多くが、ファイルの終りに達したことを判断できない。 たとえば、ファイルの終わりを示すために - 1 を使用したいと仮定してほしい。 - 1 は readDouble()readInt()、あるいは数を読む他の read メソッドを使用して、入力ストリームから読み込まれる正当な値なので、ファイルの終りを知ることはできない。 それで DataInputStream の readXXX() メソッドは、その代わりに EOFException をあげる。 EOFException が 発生するとwhile(true)は終了する。

DataIOTest プログラムを実行すると、次のような出力になる。

You've ordered 12 units of Java T-shirt at $19.99
You've ordered 8 units of Java Mug at $9.99
You've ordered 13 units of Duke Juggling Dolls at $15.99
You've ordered 29 units of Java Pin at $3.99
You've ordered 50 units of Java Key Chain at $4.99
For a TOTAL of: $892.88

参照

java.io.DataInputStream
java.io.DataOutputStream


Previous | Next | Trail Map | Writing Java Programs | 入出力ストリーム