ファイル入出力

https://gyazo.com/e3649524c7926db63267e4b9a60fb113

プロジェクトの準備

Eclipseで新規にプロジェクトを作成しましょう. メニューから[ファイル]-[新規]-[Javaプロジェクト]をクリックして,「新規Javaプロジェクトの作成」を開きます. ここでは,プロジェクト名に”Project6”を入力して,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したプロジェクトが表示されていることを確認してください.

https://gyazo.com/8b3ed6e20885121941e7c8e17cb06a81

続いてソースファイルを作成しましょう. メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”MyClass”を入力し,public static void main(String[] args)(V)にチェックを入れ,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したソースファイルが表示されていることを確認してください.

https://gyazo.com/a164f3c6c1da7bc9b5047e2c0b9a431a

ストリーム

プログラムからファイルに保存されているデータを「読み込む」ことや「書き込む」ことができます. ファイルに何かしらの操作を行う場合は,ストリームという仕組みを利用します. ストリームとは,「データの流れ」を意味しており,水道管の中を水が流れる様子に似ています. ファイルに蛇口を取り付けて,その蛇口を捻ると,ファイルに保存されているデータが少しずつ流れてくるイメージです. ここでは,10人の身長と体重が保存されたファイルからデータを読み込んでみましょう. データは氏名,身長[cm],体重[kg]で構成され,それぞれ「,(カンマ)」で区切られていることに注意してください. このようにカンマで区切られたファイルをCSV(Comma-Separated Values)形式と呼びます. ファイルをダウンロードしたら,Eclipseのプロジェクトの中にコピーしておいてください.

ファイルの読み込み

measure.csvから文字列データを読み込むには下記のように記述します. ファイルの読み込みにはFileReaderクラスとBufferedReaderクラスを利用しますが, ここではファイルに取り付ける蛇口がFileReader, 蛇口から流れてくるホースの役割がBufferedReaderクラスと考えてください. line=br.readLine()でファイルから1行ずつ読み込み,System.out.println(line)でコンソール出力しています. ファイルの終端に到達すると,readLine()nullという値を返すため, while文でlineがnullになるまで,ファイルからの読み込みを繰り返しています.

実は上記のコードだけではエラーが残ったままです. このエラーを取り除くには例外処理が必要です. 例外とはプログラムの実行中に発生する想定外の事態を意味しており, 例えば「対象のファイルが存在しない」「空っぽ(null)の変数を利用しようとした」などの状態が該当します. ファイル読込に利用するFileReaderBufferedReaderはこの例外処理が必要なクラスです. 例外処理は下記のように,例外の発生の可能性のある命令をtry{}で囲み,例外発生時の命令をcatch(例外の種類){}に記述します.

try{
	実行する命令
}catch(例外の種類){
	例外発生時に実行する命令
}

下記のコードを参考に例外処理を施してmeasure.csvから文字列データを読み込んでみましょう. ここで,e.printStackTrace();は例外の原因を突き止めるために,例外に関する情報を遡って表示する命令です. また,IOExceptionは入出力に関する例外を意味しています. プログラムの実行後に,コンソールの出力結果を確認してください.

CSV形式の処理

前述したようにCSV形式のファイルは「,(カンマ)」で区切られています. カンマで区切られた文字列(トークン)を取り出すにはStringTokenizerというクラスを利用します. 下記のコードを参考にトークン毎に取り出して,コンソールに出力してみましょう. ここで,new StringTokenizer(line, ",")は, 変数lineに代入されている文字列を「,(カンマ)」で分割して取得することを表しています. また,身長と体重は整数のため,Integer.parseInt(st.nextToken())を用いて, String型からint型に変換しています. プログラムの実行後に,コンソールの出力結果を確認してください.

ファイルの書き込み

読み込んだ身長と体重を基にBMI指数を計算して,bmi.csvに書き込んでみましょう. BMI指数は$$BMI=体重[kg]/身長[m]^2$$で求めることができます. 下記のコードを参考に,bmi.csvに文字列データを書き込んでみましょう. ファイルの書き込みにはFileWriterクラスとBufferedWriterクラスを利用します. br.write(name + "," + bmi + "\n")で名前と求めたBMI指数をCSV形式で書き込んでいます. ここで,(double)heightはint型の変数heightをdouble型に変換することを意味しています. プログラムの実行後に,コンソールの出力結果と, 作成されたbmi.csvにBMI指数が記録されていることを確認してください.

課題

下記の表を参考に,BMI指数から「低体重」「普通体重」「肥満」のいずれかを判定し,bmi.csvに書き込んでください. ファイルにはカンマ区切りで,名前BMI指数判定の順番に出力してください. 課題が完成したら,作成したプロジェクトを実行可能JARファイルの形式でファイルに保存(エクスポート)してください.

BMI指数 判定
18.5未満 低体重
18.5以上,25未満 普通体重
25以上 肥満

参考書籍