入出力

[戻る] [前に] [次に]

入出力

データの 入出力 には多数のクラスが用意されています。クラスの階層構造を下記に示します。InputStream系クラスは主にバイナリデータを扱う際に、Reader系クラスは主にテキストデータを扱う際に用いられます。

クラス階層
 Object
├□ InputStream(抽象クラス:主にバイナリ用)
│├□ AudioInputStream
│├□ ByteArrayInputStream
│├□ FileInputStream(バイナリファイル読み込み)
│├□ FilterInputStream
││├□ BufferedInputStream(非推奨)
││├□ CheckedInputStream
││├□ CipherInputStream
││├□ DataInputStream
││├□ DigestInputStream
││├□ InflaterInputStream
│││├□ GZIPInputStream
│││└□ ZipInputStream
│││ └□ JarInputStream
││├□ LineNumberInputStream
││├□ ProgressMonitorInputStream
││└□ PushbackInputStream
│├□ ObjectInputStream
│├□ PipedInputStream
│├□ SequenceInputStream
│└□ StringBufferInputStream
└□ Reader(抽象クラス:主にテキスト用)
 ├□ BufferedReader(1行ずつ読み込む)
 │└□ LineNumberReader
 ├□ CharArrayReader
 ├□ FilterReader
 │└□ PushbackReader
 ├□ InputStreamReader(文字コード指定が可能)
 │└□ FileReader(テキストファイル読み込み)
 ├□ PipedReader
 └□ StringReader

バイナリファイルを読み込む(FileInputStream)

FileInputStream は指定したファイルをバイナリファイルとして読み込みます。

FileInputStreamTest.java
import java.io.*;

class FileInputStreamTest {
    public static void main(String[] args) {
        try {
            FileInputStream in = new FileInputStream("file.txt");
            int ch;
            while ((ch = in.read()) != -1) {
                System.out.print(Integer.toHexString(ch) + " ");
            }
            in.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

シフトJISの「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。82a0 は「あ」、82a2 は「い」、82a4 は「う」のシフトJIS文字コード、d は復帰コード(CR)、a は改行(LF)コードです。漢字コードがそのまま、1バイトずつ読み込まれています。

82 a0 82 a2 82 a4 d a

テキストファイルを読み込む(InputStreamReader)

InputStreamReader は指定したストリームを、指定した文字コードで構成されるテキストファイルとして読み込みます。

InputStreamReaderTest.java
import java.io.*;

class InputStreamReaderTest {
    public static void main(String[] args) {
        try {
            FileInputStream is = new FileInputStream("file.txt");
            InputStreamReader in = new InputStreamReader(is, "SJIS");
            int ch;
            while ((ch = in.read()) != -1) {
                System.out.print(Integer.toHexString(ch) + " ");
            }
            in.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。

3042 3044 3046 d a

3042 は「あ」、3044 は「い」、3046 は「う」の Unicode表現です。InputStreamReader を用いることでシフトJIS のファイルを Java の標準文字コードである Unicode に変換しながら読み込むことができました。

文字コード "SJIS" を省略した場合は、プラットフォームに依存したデフォルト(省略時の)文字コードで読み出されます。日本語 Windows の場合のデフォルト文字コードは "MS932" になります。SJIS と MS932 はほとんど同じものですが、「~」や「∥」など一部の文字で動作が異なります。

文字コード説明
ISO-8859-1ASCII。
ISO-2022-JPJISコード。
Shift_JISJDK1.1 までは SJIS と同義。JDK1.2 からは MS932 と同義。
SJISシフトJIS。
MS932Microsoft 932。シフトJISとほぼ同様だが若干異なる。
CP932Code Page 932。MS932 とほぼ同様だが若干異なる。
EUC_JPEUC。

使用可能な文字コードに関しては下記のページを参照してください。

テキストファイルを読み込む(FileReader)

FileReader は InputStreamReader の面倒さを解消するために用意されたサブクラスです。InputStreamReader より簡単に扱えますが、文字コードには常に省略時文字コードが用いられます。

FileReaderTest.java
import java.io.*;

class FileReaderTest {
    public static void main(String[] args) {
        try {
            FileReader in = new FileReader("file.txt");
            int ch;
            while ((ch = in.read()) != -1) {
                System.out.print(Integer.toHexString(ch) + " ");
            }
            in.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}
Java
FileReader in = new FileReader("file.txt");

は、下記のコードとほぼ同じ意味を持ちます。

Java
FileInputStream is = new FileInputStream("file.txt");
InputStreamReader in = new InputStreamReader(is);

ファイルを1行ずつよみこむ(BufferedReader)

ファイルを 1行ずつ読み込むには BufferedReader を用います。

BufferedReaderTest.java
import java.io.*;

class BufferedReaderTest {
    public static void main(String[] args) {
        try {
            FileReader in = new FileReader("file.txt");
            BufferedReader br = new BufferedReader(in);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
            in.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }
}

http://www.tohoho-web.com/java/file.htm
初版:2004年6月26日、最終更新:2004年6月26日
[戻る] [前に] [次に]