web-dev-qa-db-ja.com

ファイルが存在するかどうかをテストする

Androidこのようにファイルを開こうとしています:

  try
   {
      FileInputStream fIn = context.openFileInput(FILE);
      DataInputStream in = new DataInputStream(fIn);
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      if(in!=null)
          in.close();
   }
   catch(Exception e)
   {  }

ただし、ファイルが存在しない場合は、ファイルが見つからないという例外がスローされます。ファイルを開く前に、ファイルが存在するかどうかをテストする方法を知りたいのですが。

47
rantravee

実際にファイルを開こうとせずに、ファイルが存在するかどうかを知る最良の方法は次のとおりです。

File file = getContext().getFileStreamPath(FILE_NAME);
if(file.exists()) ...

それがお役に立てば幸いです!

161
lencinhaus

ドキュメントには、Context.openFileInputがinputStream(ファイルが見つかった)を返すか、FileNotFoundException(見つからない)をスローすることが記載されています

http://developer.Android.com/reference/Android/content/Context.html#openFileInput(Java.lang.String)

したがって、例外は「テスト」のように見えます。

また、標準を使用して試すこともできます

Java.io.File file = new Java.io.File(PATHTOYOURCONTEXT , FILE);
if (file.exists()) {
    FileInputStream fIn = new FileInputStream(file);
}

しかし、それは推奨されません。 Context.openFileInput()およびContext.openFileOutput()は、デバイス上のアプリケーションストレージコンテキストに留まり、アプリがアンインストールされたときにすべてのファイルが削除されることを確認します。

26
rompetroll

標準のJava.io.Fileこれは私が作成した関数であり、正しく機能します。

private static final String APP_SD_PATH = "/Android/data/com.pkg.myPackage";
...
public boolean fileExistsInSD(String sFileName){
    String sFolder = Environment.getExternalStorageDirectory().toString() + 
            APP_SD_PATH + "/Myfolder";
    String sFile=sFolder+"/"+sFileName;
    Java.io.File file = new Java.io.File(sFile);
    return file.exists();
}
5
molbalga

fileNotFound例外をキャッチし、それをファイルが存在しないと見なしてはいけません。

2
Prashast

ファイルが存在することを確認する場合(つまり、存在しない場合は新しいファイルを作成し、存在する場合は消去しない)、File.createNewFileを使用します。

https://docs.Oracle.com/javase/7/docs/api/Java/io/File.html#createNewFile()

例えば.

{
        String pathName = <file path name>
        File file = new File (pathName);
        Uri pathURI = Uri.fromFile (file);
        boolean created;

        String mIOException = "";
        String mSecException = "";

        try
        {
            created = file.createNewFile();

            if (created)
            {
                ctxt.sendBroadcast (new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, pathURI));
            }
        }
        catch (IOException ioex)
        {
            mIOException = ioex.getMessage();
        }
        catch (SecurityException sex)
        {
            mSecException = sex.getMessage();
        }

}
1
Den-Jason

いずれの場合でもファイルを開きたい場合(つまり、ファイルが存在しない場合、新しいファイルを作成し、古いファイルに追加する場合)、これを使用できます。テストは不要です。

public static void write_custom_log(String message){
        File root = Environment.getExternalStorageDirectory();
        try{
            BufferedWriter fw = new BufferedWriter(new FileWriter(new File("/mnt/sdcard/tjb_tests/tjb_log_file.txt"),true));

            if (root.canWrite()){
                fw.write(message);
                fw.close();
                }
            } catch (IOException e) {
                Log.e("One", "Could not write file " + e.getMessage());
            }
    }
0
tjb