ほぷしぃ

Java言語入門 〜C言語を学んだ君へ〜

[第16回]入出力

[1] ファイル入出力

ファイル入出力について説明します。
ここでは、ファイル入出力の例として、ファイルのコピーを行います。

前準備(ファイルの作成)

まず、ファイル入出力に使うファイルを作成します。

ファイルは入力用と出力用の2種類を作成してください。
そして、ファイル名は「input.txt」と「output.txt」とします。
Eclipseの場合、「ファイル」→「新規」→「ファイル」をクリックします。
そして、プロジェクトを指定し、ファイル名を書きます。
その後、「終了」をクリックすると、ファイルが作成できます。

作成できたら、「input.txt」ファイルに次のように書いてください。

ほぷしぃ
ABCDEFG
12345

以上でファイル作成は終了です。

ファイル入出力の手順

ファイル入出力には

FileReaderクラス
BufferedReaderクラス
FileWriterクラス
BufferedWriterクラス

の4つを使います。
では、ファイル入出力の例として、ファイルをコピーする処理を行います。
input.txtに書いてある内容が、output.txtにコピーされるようにします。

入出力の手順は次の通りです。

1.ファイル入出力ストリームの作成
2.入力ファイルから1行読み込む
3.出力ファイルに、読み込んだ1行を書き込む
4.ファイルの最後まで読み書きの繰り返し
5.ファイル入出力ストリームを閉じる

基本的な流れを書きました。
では、次にサンプルプログラムを示します。

サンプルプログラム

サンプルプログラムです。
注意点として、上記で作成したファイルと同じプロジェクトに置いてください。

import java.io.*;

class Java16_03 {
    public static void main(String args[]) {
        try {
            // @ファイル入出力ストリームの作成
            BufferedReader br = new BufferedReader(new FileReader("input.txt"));
            BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));

            String str;
            while (true) {
                // A入力ファイルから1行読み込む
                str = br.readLine();
                if (str == null) break;
                // B出力ファイルに、読み込んだ1行を書き込む
                bw.write(str + "\n");
            } // Cファイルの最後まで読み書きの繰り返し
            
            // Dファイル入出力ストリームを閉じる
            br.close();
            bw.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果(output.txtファイル)

ファイルコピー

output.txtにinput.txtの内容がコピーされたことが確認できます。
少しプログラムの解説をします。

ファイルへの読み込みは一行単位です。
そのため、ループを使って繰り返し行います。
そして、ファイルの最後まで読み込むと、readLineメソッドの戻り値がnullになります。
そのとき、ループを抜けるように処理しています。
また、writeメソッドでは文字列を書き込んでいます。
このとき、"\n"を追加しています。
使用しないと、改行できません。

[2] データ解析

入出力の方法はだいたいわかったと思います。
次は、データの型を意識して読み込みを行います。

StringTokenizer

これまでの入力は文字列(String型)のみでした。
しかし、入力データは文字列ばかりでなく、数値もあります
また、文字列と数値の混合データも考えられます。
こうした場合に、StringTokenizerクラスを使います。
このクラスは、入力データを解析し、トークンを生成することができます。
トークンとは、文字列・数値などの最小単位のことです。
<>br 例えば、次のようなファイルデータがあります。

太郎,日本,10
次郎,中国,11
三郎,独逸,12

見方は一行に「名前」と「国籍」と「年齢」が書いてあります。
つまり、3人分の個人情報です。

このデータを読み込む場合、これまでの方法では"太郎,日本,10"という単なる文字列で読み込んでしまいます。
このままでは、正しい入力とは言えません。

しかし、StringTokenizerクラスを使うと、"太郎"と"日本"と"10"という3つのトークンに分けることができます。
ただし、「型」はすべてString型です。
そのため、Integerクラスを使って、年齢は数値に変換します。
これで正しいデータ入力になります。
では、次にデータ解析のサンプルプログラムを示します。

サンプルプログラム

入力ファイル「text.txt」には

太郎,日本,10
次郎,中国,11
三郎,独逸,12

の個人情報を入れてください。

import java.io.*;
import java.util.StringTokenizer;

class Java16_04 {
    public static void main(String args[]) {
        try {
            BufferedReader br = new BufferedReader(new FileReader("text.txt"));

            String str;
            String name;
            String nationality;
            int age;
            while (true) {
                str = br.readLine();
                if (str == null) break;
                // 区切り文字","を指定する
                StringTokenizer st = new StringTokenizer(str, ",");
                // トークンを取り出す
                name = st.nextToken();
                nationality = st.nextToken();
                age = Integer.parseInt(st.nextToken());
                // 出力
                System.out.print("名前は" + name);
                System.out.print(" 国籍は" + nationality);
                System.out.println(" 年齢は" + age);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

実行結果

トークンとファイル

ファイル入力の方法は今までと同じです。
入力した文字列を使って、StringTokenizerクラスでトークンに切り分けます。
このとき、どこで区切るかはコンストラクタで指定します。
トークンはnextTokenメソッドで受け取ります。
ただし、文字列しか返さないので、年齢などの異なる型には、ラッパークラスを用いて変換するようにしてください。
なお、StringTokenizerクラスは「java.util」パッケージにあるので、必ず、importするようにしてください。



前のページへ ページのトップへ 第1問-問題へ