17. 入力ストリーム

ファイルやネットワーク、標準入力などからデータを読み込むのに使います。

(1) ファイルから読み込むためのストリームを作る

 出力のしかたはわかったので、今度は入力をやってみましょう。まずはファイルから入力したい場合です。
 ファイルからの入力は java.io.FileInputStream というクラスを使います。

 このクラスは出力ストリームの基本機能を提供する java.io.InputStream クラスのサブクラスです。InputStream クラスは抽象クラスなので、実際に使われるのはサブクラスになります。

 まずは FileInputStream クラスのオブジェクトを作ります。簡単なコンストラクタを2種類だけ紹介しておきます。
FileInputStream(File file) throws FileNotFoundException

FileInputStream(String fileName) throws FileNotFoundException

 1つ目のコンストラクタでは読み込みたいファイル名を File オブジェクトで、2つ目のコンストラクタを使う場合には、ファイル名をそのまま指定します。

 このようなコンストラクタを使って FileInputStream オブジェクトを生成した時点でファイルをオープンしたことになります(FileInputStream には open( ) というメソッドはありません)。

FileInputStream fis = new FileInputStream("filetest");



(2) ファイルからの読み込み

 FileInputStream のオブジェクトを使ってデータを書き込んでいきましょう。読み込み用のメソッドは次の3種類があります。データの終端にくると -1 を返します。

1. int read(byte[ ] b) throws IOException
 入力ストリームから 1 バイトを読み込みます。

2. int read(byte[ ] b) throws IOException
 入力ストリームから最大 b.length バイトをバイト配列に読み込みます。

3. int read(byte[ ] b, int start, int len) throws IOException
 入力ストリームの start バイトめから最大 len バイトをバイト配列に読み込みます。

4. void close( ) throws IOException
 FileInputStream を閉じます。

 戻り値は int 型になっていますが、バイト単位に読み込まれることに注意してください。

 下の例題は16章の FileOutputStream で書き込んだデータを読み込む例です。実行してみるときは、16章で作った filetest というファイルをカレントディレクトリにおいてください。

  FileInTest.java

import java.io.*;

class FileInTest {
    public static void main(String args[]) {
        FileInputStream fis = null;
        
        try {
            fis = new FileInputStream("filetest");
        } catch (Exception e) {
            System.out.println("ファイルを開けません");
            e.printStackTrace();
        }
        
        try {
            while (true) {
                int data = fis.read();
                if (data==-1) break;
                System.out.println(data);
            }
        } catch (Exception e) {
            System.out.println("読み込みに失敗");
            e.printStackTrace();
        }

        try {
            fis.close(); 
        } catch (Exception e) {
            System.out.println("ストリームを閉じられません");
            e.printStackTrace();
        }
    }
}


 実行方法

C:\java_test>java FileInTest
10
20
30
40
50


(3) 入力フィルタストリーム

フィルタ出力ストリームと同じように、入力ストリームにもがあります。入力の場合は java.io.FilterInputStream のサブクラスを使っていきます。

 16章の DataOutputStream に対応する入力フィルタストリームは java.io.DataInputStream です。DataInputStream では入力ストリームに流れているバイト単位のデータを基本データ型に再構築してアプリケーションに取り込むことができます。

FIleInputStream fis = new FileInputStream("filetest");
DataInputStream dis = new DataInputStream(fis);



 DataInputStream のコンストラクタは以下の通りです。フィルタストリームなので、やはり既存の入力ストリームが必要になります。

DataInputStream(OutputStream out)


 DataInputStream を使って基本データ型を読み込むメソッドのうち、よく使うものをあげておきます。(基本機能の3つの read( ) も使えます)。すべてのメソッドは IOException を投げる可能性があります。readXXX( ) を使う場合にはデータの終端にきたときに EOFException が発生することに注意してください。

1. boolean readBoolean( )
 boolean 値を読み込みます。

2. char readChar( )
 1文字読み込みます。

3. int readInt( )
 int 型データを読み込みます。

4. long readLong( )
 long 型データを読み込みます。

5. float readFloat( )
 float 型データを読み込みます。

6. double readDouble( )
 double 型 データを書き込みます。

7. String readUTF( )
 文字列を読み込みます。

 次の例題は16章の DataOutputStream で書き込んだデータを読み込むものです。

  DataInTest.java (例外処理は簡素化しています)

import java.io.*;

class DataInTest {
    public static void main(String args[]) {
        try {
            FileInputStream fis = new FileInputStream("filetest2");
            DataInputStream dis = new DataInputStream(fis);
            try {
                while (true) {
                    System.out.println( dis.read() );
                    System.out.println( dis.readInt() );
                    System.out.println( dis.readUTF() );
                }
            } catch (EOFException e) {
                System.out.println("データの終端です");
            }
            dis.close();
            fis.close();
        } catch (Exception e) {
            System.out.println("例外発生");
            e.printStackTrace();
        }
    }
}


 実行方法

C:\java_test>java DataInTest
10
100000
Java Java Java
-1
データの終端です

 filetest2 では DataOutputStream によって3件のデータが書き込まれています。データを3件読むともう読み込めるものがありませんが、read( ) はデータの終端で -1、readInt( ) はデータの終端で EOFException を投げるので、表示結果は -1 が出た後に「データの終端です」と表示されます。

前の章(16.出力ストリーム)   次の章(18.Writerクラス)