※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

外部ファイルを読み込もうと思ったらFileNotExceptionになっちゃった。
writeの時はなくても勝手に作ってくれる機能があるから問題ないけど、readするファイルがあるかないかって知っておきたいよね。
いままでどうして必要なかったんだろうって思っちゃった。どうして??

そんなわけでいまさらですが例外発生する前にファイルがあるかチェックできないかなあと思って調べて作ってみたのでメモメモ。

目次


exists()メソッドで存在チェック

java.io.File.exists()を使います。
いぐじっと?(違 そう読んだ私はバイリンガルになれない負け組。

えぐしすつ?読み方調べとこう。。ほんと英単語苦手。

「存在する」って意味だそうで。そのまんまでしたはい。
存在チェックでisExists()ってメソッド作るの、あれですね。

実際に使ってみますよやっちゃいますよ。

ファイルがあるかチェックして、なかったら作るメソッド

 private void checkFile(){
  File file = new File(filename);
  if (!file.exists()){
  try {
  file.createNewFile();
  } catch (IOException e) {
  //エラー処理
  }
  }
 }

filenameに「c\:file20070409.txt」って指定したりしたら、cドライブ直下にfile20070409.txtってファイル(カラ)を作ってくれるですよ。
Fileをnewしただけでは実際に作ってはいないのでcleateNewFile()メソッドを使って物理的に作っちゃうです。
それがこれ。
file.createNewFile();
これは
boolean isNew = file.createNewFile();
っていろんなサイトには書いてあったんだけど。
作ったの?作ってないの?って判定ができるんかいな?

ってここまで書いて気づいた。
ああああああああああああああ!!!おばかわたし。

createNewFile()メソッドでも存在チェック

なかったら作ること前提ならcreateNewFile()メソッドだけでも良かったらしいワナ。
(ノ▽`)

というわけで作り直した。ソースのライン数は少なければ少ないほどいいんだったよね?
 private void createFile(){
  File file = new File(filename);
  try {
  file.createNewFile();
  } catch (IOException e) {
  //エラー処理
  }
 }
あったら作らないだけなのでこれでいいんだな。

ただファイルがなかったので新しく作ったよ」みたいなメッセージを出したいなら
 private void createFile(){
  File file = new File(filename);
  try {
  if(file.createNewFile()){
  System.out.println("新しく作ったの" + file.getPath());
  }else{
  System.out.println("もともとあったわ" + file.getPath());
  }
  } catch (IOException e) {
  //エラー処理
  }
 }
って判定できるです。

上項のcreateNewFileの戻り値ってやつですねーそうですねー。
trueならなかったから新しく作ったよ
falseならファイルが存在したから作んなかったよ

使うメソッドも減ったし、これを採用してみて見てもらおう。。。

気になった例外SecurityException

java.io.createNewFile()メソッドの例外は2つあるらしい。
IOexceptionだけcatchしたけど、もうひとつ。
SecurityExceptionっていうみたい。

でもこれeclipseでは拾ってなかったですよ。

セキュリティーマネージャーがあるときに云々。
つまり書き込み制御とかされてるときに書き込めなかったときの例外。
そういうことありそう。。。権限とかそういうことかな。