ファイルの読み込み時に間違ったパスを指定すると存在しないファイルを開こうとしてエラーとなります。もし元々存在するファイルを選択できるようになっていればこのような問題は起こりません。ファイルのオプションを表示させてユーザがそれを選ぶことによって読み込みファイルを指定するようにしたいのですが一覧を表示させるところから始めます。
ファイル一覧を表示する
まずサンプルのディレクトリをファイルを用意します。
/Users/myaccount/mywork
このパスはユーザやOSによって適宜読み替えてください。次に3つほどファイルを作ります。
file_a.txt
これはfile_a.txtの内容です。
file_b.txt
これはfile_b.txtの内容です。
file_c.txt
これはfile_c.txtの内容です。
コードを以下のように書きます。
File mywork = new File("/Users/myaccount/mywork"); String[] filenames = mywork.list(); for(String filename:filenames){ System.out.println(filename); }
ディレクトリのパスでFileクラスのインスタンスを作成しそれに対しlistメソッドを呼び出すと文字列の配列が渡されます。これを実行すると以下のような結果になります。
.DS_Store file_a.txt file_b.txt file_c.txt
おやと思ったのが最初の行に.DS_Storeという見覚えのないファイルが出力されています。調べてみるとこれはMac用のディレクトリ情報を保持しておく隠しファイルだそうです。ファインダーからは見えないのですがJavaでみると隠されずにリストに上がってしまったということでしょう。やはり選んで欲しくないファイルは一覧に出したくないので工夫してみましょう。Windowsのユーザーには関係ない対応ですが似たようなケースがある場合には参考にしてください。
listメソッドで一覧を出す時にかけるフィルター用インタフェースがあります。インタフェースはメソッドの定義はされていますが実装はないのでクラスとして扱えません。このため以下のように実装も記述してインスタンスを作成します。
FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { if(name.toLowerCase().equals(".ds_store")){ return false; } return true; } };
インタフェースや抽象クラスからインスタンスを作成する時には実装されていないメソッドが実装されている必要があります。上記のFilenameFilterインタフェースはacceptメソッドを実装する必要がありました。何度も利用するのであれば.javaファイルを作って名前をつけて継承・実装クラスを作れば良いのですが一回限りの場合はこのように処理の中で実装を書き込むことによってインスタンスをその場で作ることができます。これを無名クラスといいます。
String[] filenames = mywork.list(filter);
先ほどのリストメソッドを呼ぶときに引数としてこのフィルターを渡すと隠しファイルは表示されなくなります。