- ベストアンサー
特定の拡張子以外の読み込みに対してエラーを返す方法を教えてください。
現在このプログラムはファイルの読み込みや、上書きを行う機能を有しているのですが、ここに新たに.txt以外の拡張子が読み込まれた場合にエラーを表示させる命令を追加したいと思うのですが、どうにもうまく行きません。そこでネットで参考サイトも見てみましたが、それでも理解できません。(以下のURLが参考にしたサイトです) http://www.techscore.com/tech/J2SE/IO/answer/1-3.html どなたか分かる方見えましたらご回答お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「読み込まれた場合にエラー」というか「ファイル名が渡された」ときに、そのファイル名(の拡張子)をチェックして読むかどうか決めるのですよね?例示されたURLの記述でそのまま String ext = getExtension(file); if (ext != null && ext.equals("txt")) { return true; } として受け付けるかどうか決定すればいいのでは?それとも今現在のプログラムに「読み込むべきファイルかどうか」の判定がそもそも存在していないのでしょうか?
その他の回答 (1)
- shimix
- ベストアンサー率54% (865/1590)
ANo.1です。 ファイルがpathで渡されるのですから、FileReaderのインスタンスを作成する前にpathの正当性をチェックしてください。例示されたURLに書かれている「拡張子を取得するメソッド」のコードを丸写しして拡張子がtxtかどうかチェックしてください。 「catch(FileNotFoundException e)」は便利ですが、渡されたもののチェックは先にすべきだと思います。エラーが捕捉出来るのは確かに楽なのですが、エラーリカバリ(作成したものの解放とか)まで考慮するとなるべく例外に落としたくはないです(古い考えかなぁ・・)。
お礼
なるほど分かりました。 ご指摘していただいたの通りの方法で試してみます!! どうも、ありがとうございました。
お礼
catch(FileNotFoundException e)//ファイルが見つからなかった時 { System.out.println("ファイルが見つかりません。"); } catch(IOException e)//入出力エラーが発生した場合 { System.out.println("入出力エラーが発生しました。"); } } /** * テキストファイルに書き込み(上書きモード) * @param path ファイルのパス * @exception FileNotFoundException ファイルが見つからなかった場合 * IOException 入出力エラーが発生した場合 */ public void writeFile(String path) throws Exception { try { File file = new File(path); //Fileのオブジェクトを生成 FileWriter fw = new FileWriter(file); //Filewriterのオブジェクトを生成 //リストの要素が無くなるまでループ for(int i = 0; i < list.size(); i++) { fw.write(get(i)); fw.write("\r\n"); } System.out.println("ファイルに書き込みました。"); fw.close(); } catch(FileNotFoundException e)//ファイルが見つからなかった時 { System.out.println("ファイルが見つかりません。"); } catch(IOException e) { System.out.println("入出力エラーが発生しました。"); } } /** * テキストファイルの書き込み(追記モード/上書きモード) * @param path ファイルのパス * modeAdd ファイル上の要素に対しての true 追記モード / false 上書きモード * @exception FileNotFoundException ファイルが見つからなかった場合 * IOException 入出力エラーが発生した場合 */
補足
失礼いたしました。 下記が私が今現在までに作成したプログラムになります。 主な用途はインデックスに要素を追加することと、 それをソートすることと、ファイルを読み込みその情報を上書きすることです。現在はtxt拡張子以外のファイルの読み込みもできてしまい、 上書き処理をするとファイルを破壊してしまうので、 拡張子の読み込み制限を設けたいと考えています。 package studyA; import java.util.*; import java.io.FileReader; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; public class A23_StrArray extends A22_StrArray { /** * テキストファイルの読込み(上書きモード) * @param path ファイルのパス * @exception FileNotFoundException ファイルが見つからなかった場合 * IOException 入出力エラーが発生した場合 */ public void readFile(String path) throws Exception { try { //BufferedReader in = new BufferdReader(new FileReader()) FileReader fr = new FileReader(path); //FileReaderのインスタンスを作成 BufferedReader br = new BufferedReader(fr); //BufferedReaderのインスタンスを作成 String line; list.clear(); //リストをクリア while ((line = br.readLine()) != null) //要素がなくなるまで繰り返す { add(line); } System.out.println("ファイルを読み込みしました。"); br.close(); } catch(FileNotFoundException e)//ファイルが見つからなかった時 { System.out.println("ファイルが見つかりません。"); } catch(IOException e)//入出力エラーが発生した場合 { System.out.println("入出力エラーが発生しました。"); } } /** * テキストファイルの読み込み(追記モード/上書きモード) * @param path ファイルのパス * modeAdd ファイル上の要素に対しての true 追記モード / false 上書きモード * @exception FileNotFoundException ファイルが見つからなかった場合 * IOException 入出力エラーが発生した場合 */ public void readFile(String path, boolean modeAdd) throws Exception { try { FileReader fr = new FileReader(path); //FileReaderのインスタンスを作成 BufferedReader br = new BufferedReader(fr); //BufferedReaderのインスタンスを作成 String line; if (modeAdd == true) //追記モード { while ((line = br.readLine()) != null) { list.add(line); } System.out.println("ファイルを追記して読み込みました。"); br.close(); } if ( modeAdd == false) //上書きモード { list.clear(); //リストのクリア while ((line = br.readLine()) != null) { list.add(line); } System.out.println("ファイルを上書きして読み込みました。"); br.close(); } }