プログラミング論
第 05 回
ファイル入出力の基礎
教材の追加
Java 第 2 版 実践編 アプリケーション作りの基本 三谷 純(著),翔泳社 ・・・ただし販売終了
今回の内容のみ抜粋したPDFをMoodleからダウンロード
古本 or 持っている人から譲ってもらう
第3版を買う(ただし,GUIの部分は授業内容と異なる)
Java SE 8 / Java FX 8 概説,中村 勝則(著)
無償公開されていたものをMoodleからダウンロード
第06回以降の参考書
入出力
入力: プログラムにデータを送る
プログラムがデータを読み込む
キーボードから(これまでのScannerクラス等)
ファイルから(今回の授業)
ネットワークやその他の周辺機器から
出力: プログラムからデータを書き出す
画面へ(これまでのSystem.out.print系)
ファイルへ(今回の授業)
ネットワークやその他の周辺機器へ
• ストリームオブジェクトが橋渡し
• 文字列とそれ以外(バイナリ)で異なる扱い
ファイル入出力の準備
java.io パッケージをインポート
io = Input Output 一般的な入出力のためのパッケージ
packageの行の下あたりに,次の文を挿入
例外処理 ( 実践編: p.33-)
ファイルが見つからない,データが読み取れないなど トラブルがあった場合への備え
トラブルが起こりそうな部分を try { } で囲い
検出されたトラブルへの対応を catch() { } で指示
例えば
import java.io.*;
catch(IOException e) { System.out.println(e); } Eclipseが自動で
最小限のパッケージに置換
ファイルへの出力 ( 実践編: p.149-)
1. Fileクラスで書き込むファイルを指定
2. FileWriterクラスで書き込む機能を準備
3. BufferedWriterクラスで溜める機能を連結
4. 変数名.write(データ) の形でファイルやバッファに出力 5. 変数名.close() でファイルを閉じる
プログラム ファイル
プログラム
BufferedWriter FileWriterファイル プログラム
FileWriterファイル
出力するデータを 一時的に溜める
まとめてファイルに 書き込む
ちまちま書き込むのは効率が悪い
ファイル出力の例
try {
File file = new File("output.txt");
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0; i < 5; i++) { bw.write("[" + i + "]");
bw.newLine(); // 改行を出力 }
bw.close();
} catch(IOException e) { System.out.println(e);
}
[0]
[1]
[2]
[3]
[4]
実行結果:
output.txt の中身
入出力用のファイルはどこに?
ファイルはプログラムを実行したフォルダ内に存在
正確には,そのフォルダから見た,File()で指定する位置
詳しくは「ファイルパス」について各自で調べること
Eclipse を使っている場合
パッケージ・エクスプローラで対象のプロジェクトを
右クリック→「Windowsエクスプローラ」(MacではFinder)
フォルダの詳しい位置を知りたい場合は
右クリック→「プロパティ」→「リソース」→「ロケーション」
JARファイル,あるいはコマンド
srcではない
演習(課題1)
指示に従ってファイルに出力してみよう
詳細は課題のページに!
余談: ファイルへの追記
通常, FileWriter でファイルを指定すると その時点でファイルの内容が一旦消される
new FileWriter(File 変数 , true) とすると
ファイルの内容を消さずに追記することが可能
余談: PrintWriter を利用したファイル出力
BufferedWriter に PrintWriter を連結させておくと print() , println() , printf() を使うことが可能
try {
File file = new File("output.txt");
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw); // さらに連結 for(int i = 0; i < 5; i++) {
pw.println("[" + i + "]"); // ちゃんと改行される }
pw.close();
} catch(IOException e) { System.out.println(e);
}
ファイルからの入力 ( 実践編: p.156-)
1. Fileクラスで読み込むファイルを指定
2. FileReaderクラスで読み込む機能を準備
3. BufferedReaderクラスで溜める機能を連結
4. 変数名.read() の形でファイルやバッファから入力 変数名.readLine() の形で1行分の文字列を入力 5. 変数名.close() でファイルを閉じる
ファイル
FileReader BufferedReaderプログラム
ファイル
FileReaderプログラム
ファイルから
まとめて読み込む
入力するデータを 一時的に溜める
日本語等を含む場合 文字コードは
UTF-8のみOK
ファイル入力の例
try {
File file = new File("input.txt");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String s;
// ファイルの末尾に来るとnullになるため終了 while((s = br.readLine()) != null) {
System.out.println(s + "です");
}
br.close();
} catch(IOException e) { System.out.println(e);
}
ミミズです オケラです アメンボです
実行結果:
ミミズ
オケラ
アメンボ
演習(課題2)
指示に従ってファイルから入力してみよう
配布物のダウンロード&実行フォルダへの保存を忘れずに
詳細は課題のページに!
余談: Scanner を利用したファイル入力
これまでと似た形でのファイル入力
1. java.util.Scanner をインポート
(いつもの課題で上の方に記述されている感じに)
2. new Scanner(File型変数) で準備完了 3. 変数名.nextLine() で1行読み込み
変数名.hasNext で次のデータが存在するか確認
変数名.useDelimiter("文字列") で
データを区切る文字列を変更(CSVなら",")
変数名.next() で次の区切りまでのデータを読み込み 4. 変数名.close() ファイルを閉じる
余談: Scanner を利用したファイル入力の例
try {
File file = new File("input.txt");
Scanner scan = new Scanner(file);
int line = 1;
while(scan.hasNext()){ // 次にデータがある場合は継続 String str = scan.next();
System.out.println(line + ":" + str);
line++;
}
scan.close();
} catch(FileNotFoundException e) { System.out.println(e);
}
1:ミミズ 2:オケラ 3:アメンボ
実行結果: