目次
新しく外部ファイルを作ったり、既存のファイルにアクセスするためファイル名を入力するには、キーボードからファイル名を入力する代わりに、ワープロを使うときに使うファイルダイアログを使うほうが間違いが少ない。Java では、FIleDialog
クラスの getDIrectory, getFile
メソッドを使う。次のコードを実行すると、選択した(入力した)ファイル名のフルパスが表示される。
// ファイルダイアログのインスタンスを作成
FileDialog filedlog = new FileDialog(new Frame(), "ファイル指定"); filedlog.setVisible(true); // 入力情報を取り込む
String fname = filedlog.getDirectory() + filedlog.getFile(); System.out.println(fname);
FileDialog コンストラクタの2番目の引数はタイトルバーに表示される文字列を指定する。
外部ファイルへ書き出すには、FileWriter
クラスを使う。 write
メソッドにより、すべて文字列に変換されて記憶される。fname
は FileDialog
を使って入力したものを使う。書き込みが終わったものは close
メソッドで閉じなければいけない。
try { FileWriter fwrite = new FileWriter(new File(fname), true); // true は追加出力 for (int i = 0; i < 20; i++) { fwrite.write((int) (100 * Math.random()) + " "); } fwrite.write("\n\n"); fwrite.close(); } catch (IOException e) { System.out.println("エラー:" + e); }
ファイルがなければ新規に作成され、もし存在する場合は、2番目の引数を true
にすることによって、ファイル内容を残したまま、最後に追加される(appendモード)。
大量のファイルを出力する場合は、出力バッファを利用する BufferedWriter
クラスを利用すると良い。改行を出力する場合は、write("\n")
とする代わりに newLine()
メソッドを使う。
try { BufferedWriter bwrite = new BufferedWriter(new FileWriter((new File(fname), true)); for (int i = 0; i < 20; i++) { bwrite.write((int) (100 * Math.random()) + " "); } bwrite.newLine(); bwrite.close(); } catch (IOException e) { System.out.println("エラー:" + e); }
PrintWriter
を使えば、コンソール出力と同じように、print, printf
や println
メソッドを使って成形した文字列を記録することができる。printf() メソッドで書式に従って書き込み、作業が終了したら close() メソッドを実行してファイルを閉じる。ファイル名のエラーなどの発生に備えて、try ... catch 構文の中で実行する。
try { PrintWriter pwrite = new PrintWriter(new File(fname)); for (int i = 0; i < 20; i++) { pwrite.printf("%5d", (int) (100 * Math.random())); } pwrite.close(); } catch (Exception e) { System.out.println("エラー:" + e); }
PrintWriter
に BufferedWriter
を組み合わせて効率化することも出来る。また、FileWriter
を経由することで、追い書きモードで書き出すこともできる。
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter((new File(fname), true)));
あるいは
PrintWriter pw = new PrintWriter(new BufferedWriter((new File(fname), true));
外部ファイルからデータを読み出すには、FileReader
クラスを使う。read
メソッドにより、一文字ずつ取り出すことが出来る。ファイルの終わりは「-1
」を検出することで認識できる。fname
は FileDialog
を使って入力したものを使う。
try { FileReader fread = new FileReader(new File(fname)); int bt; while((bt = buffer.readLine()) != -1) { System.out.print((char)bt); } fread.close(); } catch (Exception e){ System.out.println("エラー:" + e); }
まとめて読み出すために、BufferedReader
クラスを利用する。readLine
メソッドにより改行までの1行分を取り出すことが出来る。
try { BufferedReader bread = new BufferedReader(new FileReader(new File(fname))); String st; while((st = bread.readLine()) != null) { System.out.println(st); } bread.close(); } catch (Exception e){ System.out.println("エラー:" + e); }
取り込んだ1行分の文字列からデータを取り出すには、String.split, Integer.parseInt, Double.parseDouble
などのメソッドを必要とする。たとえば、複数のスペースで区切られた int
型データを取り出す場合の例を次に示す。
// データだけを取り出す(区切りは1個以上の空白) String[] sts = st.split(" +");
// 数値候補を数値に変換する int[] dat = new int[100]; int n=0; for(int i=0; i<sts.length; i++) if(sts[i].length() > 0) dat[n++] = Integer.parseInt(sts[i]); // 先頭の空白を削除
取り込むデータのデータ型が分かっている場合は、Scanner
クラスを利用する方がコードが簡単になる。hasNext()
メソッドによってファイル終わりをチェックしながら、nextInt(), nextDouble(), next()
などのメソッドでデータを取得する。データはスペース、あるいはタブ区切りとする。入力データがなくなった時 close() メソッドを実行してファイルを閉じる。
数値データがカンマで区切られている場合は、useDelimiter(",")
メソッドを呼ぶ。この場合、数値以外にスペースが入っていると、InputMismatchException
例外事象が発生するので注意を要する。
ファイルを扱うため、不正動作(ファイル名が違う、データの型が違う、など)対処のために try ... catch 構文の中で実行する。
try { Scanner fileIN = new Scanner(new File(fname)); while(fileIN.hasNext()) { System.out.print("<"+fileIN.nextInt()+"> "); } fileIN.close(); } catch(Exception e) { System.out.println("エラー:" + e);
}
Scanner のインスタンス生成の際の引数として、ファイル名でなく、System.in を指定すればキーボードからの入力指令になる。この場合は try ... catch の中に入れなくても良い。
完成したプログラムを実行ファイルとして独立させるには、JAR形式のファイルにしておく必要がある。その手順は以下の通り。
この手順を実行して生成されるアイコン(exeファイル)をダブルクリックすると、単独でアプリケーションが立ち上がる。