2013 年 11 月 28 日 ( 木 ) 実施 ファイル操作とディレクトリ操作今回の授業では,Java 言語でのファイル操作とディレクトリ操作とについて学習する ファイル操作ファイル操作は,C 言語プログラミングで学んだように, 次の順序で行う 1) ストリームを開く 2) ストリームからの入力, ストリームへの出力 3) ストリームを閉じる Java 言語では, ファイル操作に関係するクラスが複数用意されている ここでは, テキストファイルからの読み込みのための簡易クラス FileReader, テキストファイルに文字を書き込むための簡易クラス FileWriter の使い方を中心に学ぶ ディレクトリ操作 Java 言語でディレクトリ操作を行うには, ファイルおよびディレクトリのパス名の抽象表現を表すクラス File を用いる パス名には絶対パス名 ( ルートディレクトリから辿ったパス名 ) または相対パス名 ( カレントディレクトリから辿ったパス名 ) を用いる 例題 1 ( ファイルの読み込み ) 次のプログラムを入力し, ビルドして, 実行せよ ここで, クラス名はSample10_1, ソースファイル名は Sample10_1.java とする なお,Eclipse ではそのまま実行した後, 実行 実行構成 引数 プログラムの引数 と辿り, テキストエリア内に jimbo\cuc.java (jimbo の箇所は自分の名前に置き換える ) を入力して実行する public class Sample10_1 { if (args.length!= 1) { System.out.println(" 利用法 :java Sample10_1 ファイル名 "); String fname = args[0]; BufferedReader br = new BufferedReader(new FileReader(fname)); - 1 -
while ((iline = br.readline())!= null) { System.out.println(iline); catch (FileNotFoundException fe) { System.out.println(fname +" というファイルが開けません "); catch (IOException err) { 解説 1.args.length は, 配列を参照する変数 args が参照している配列の要素の個数を int 型の値として返す この値はプログラム実行時に与えられたコマンドライン引数の個数 ( プログラム名はカウントしない ) で, これが 1の場合は,args[0] に引数が格納されている 2.System.exit はプログラムの実行を中断する 引数は 0 の時に正常終了,0 以外の時に異常終了を表す 3.FileReaderクラスのインスタンスが生成されるとストリームが開かれる 4.closeメソッドはストリームを閉じる際に用いる 5. 例外クラスFileNotFoundException は指定されたパス名で示されるファイルが開けなかったことを通知することに対応する 例題 2 ( ファイルの読み込み及び書き込み ) 次のプログラムを入力し, ビルドして, 実行せよ ここで, クラス名はSample10_2, ソースファイル名は Sample10_2.java とする なお,Eclipse ではそのまま実行した後, 実行 実行構成 引数 プログラムの引数 と辿り, テキストエリア内に jimbo\cuc.java 半角空白 Cuc_sjis.java (jimboの箇所は自分の名前に置き換える) を入力して実行する import java.io.bufferedwriter; import java.io.fileoutputstream; import java.io.outputstreamwriter; import java.io.printwriter; public class Sample10_2 { if (args.length!= 2) { System.out.println(" 利用法 :java Sample10_2 入力ファイル名出力ファイル名 "); - 2 -
String fname1 = args[0], fname2 = args[1]; BufferedReader br = new BufferedReader(new FileReader(fname1)); FileOutputStream fos = new FileOutputStream(fname2); PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(fos, "SJIS"))); while ((iline = br.readline())!= null) { pw.println(iline); pw.close(); catch (FileNotFoundException fe) { System.out.println(fname1 +" というファイルが開けません "); catch (IOException err) { 解説 1.FileOutputStream クラスは, 生のバイト ( イメージデータ等 ) のストリームを書き込む際に用いる 2.OutputStreamWriter クラスは, バイトストリームに書き込まれた文字を指定された文字セットによりバイトに符号化する 用いる文字セットは, 名前で指定するか, 明示的に渡すか, またはプラットフォームのデフォルトの文字セットの何れかである ここでは,"SJIS" により, Shift_JISで書き込むことを指定している 3.PrintWriter クラスは, オブジェクトの書式付き表現をテキスト出力ストリームに出力する際に用いる そのインスタンスに対して,printlnメソッドは行単位の書き込みを行う 例題 3 ( ディレクトリの表示 ) 次のプログラムを入力し, ビルドして, 実行せよ ここで, クラス名はSample10_3, ソースファイル名は Sample10_3.java とする なお,Eclipse ではそのまま実行した後, 実行 実行構成 引数 プログラムの引数 と辿り, テキストエリア内に jimbo (jimboの箇所は自分の名前に置き換える ) を入力して実行する import java.io.file; public class Sample10_3 { - 3 -
if (args.length!= 1) { System.out.println(" 利用法 :java Sample10_3 パス名 "); String dname = args[0]; File directory = new File(dname); String[] dlist = directory.list(); for (int i=0; i<dlist.length; i++) { System.out.println(dlist[i]); 解説 File クラスのインスタンスに対して,list メソッドは抽象パス名が示すディレクトリにあるファイル及びディレクトリを示す文字列の配列を返す 抽象パス名がディレクトリを示さない場合, このメソッドは null を返す ディレクトリを示す場合は, 文字列の配列が返される なお, 結果の配列の名前文字列は特定の順序にはならない 演習 1 次のプログラムリストの空欄を埋めたプログラムを作成し, ビルドして実行せよ ここで, プログラムのクラス名は Ex10_1, ソースプログラム名はEx10_1.java とする なお, このプログラムは,10 個の整数データが各行に記述された入力用のファイル input.txtを開き, そこから読み込んだデータをソートした結果を, 出力用のファイル output.txt を開いて書き込むものである Eclipse ではそのまま実行した後,workspace の直下の Prog2 ( プロジェクト名のディレクトリ ) にダウンロードした input.txtを配置して実行する import java.io.bufferedwriter; import java.io.filewriter; import java.io.printwriter; public class Ex10_1 { final int NUM = 10; int[] x = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0; BufferedReader br = new BufferedReader(new FileReader("input.txt")); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("output.txt"))); - 4 -
for (int i=0; i<num; i++) { iline = 1).readLine(); x[i] = Integer.parseInt(2) ); sort(x); for (int i=0; i<num; i++) { 3).println(x[i]); pw.close(); catch (FileNotFoundException fe) { System.out.println("input.txt というファイルが開けません "); catch (IOException err) { catch (NumberFormatException exnf) { System.out.println(" 整数でないものが含まれています "); private static void sort(int[] a){ for(int i=0; i<a.length-1; i++) for(int j=i+1; j<a.length; j++) if(a[j]>a[i]){ int temp = a[i]; a[i] = a[j]; a[j]=temp; 提出物 : 1) 例題 1 3 の出力結果をコピーして貼り付けたテキストファイル res10.txt 2) 演習 1 のソースプログラムのファイル Ex10_1.java - 5 -