2010-05-07 73 views
46

我想在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) 
    { } 

,但如果該文件不存在,未發現異常被拋出的文件。我想知道如何在試圖打開文件之前測試該文件是否存在。

+2

如果這是您的實際異常處理程序,請重新考慮它。 http://www.rockstarprogrammer.org/post/2007/jun/15/empty-catch-blocks-are-always-wrong/ – Thomas 2010-05-07 08:16:49

+0

@Thomas曾經是我的異常處理程序的一個子句就像這個(複製一些代碼關閉'網絡。)我想一個好的複製規則就是在實際使用它之前檢查一切。我有足夠的麻煩使用我的OWN代碼。 – 2012-08-29 21:13:36

回答

26

文檔說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()確保您保持在設備上的應用程序存儲上下文中,並且在卸載應用程序時刪除所有文件 。

+0

適用於檢查SD卡上是否存在目標文件 - 謝謝! – mishkin 2010-11-20 04:28:45

+0

非常感謝:) – 2011-08-26 05:01:22

+0

爲什麼不推薦? – 2011-11-29 14:13:30

2

你爲什麼不抓住FileNotFound異常,並將其作爲文件不存在。

+0

這就是我實際做的方式,但我想知道是否有另一種方式 – rantravee 2010-05-07 09:39:57

+0

@rantravee:您所採取的方式是捕捉所有異常。除了sl,之外,它也不會告訴你爲什麼會發生異常。如果你只捕獲了'FileNotFoundException',那麼當你捕獲它時,你會知道它被拋出,因爲文件不存在(而不是泛型異常,這可能意味着在你的try塊或者某些東西的某個地方出現了錯誤它調用或調用它的東西,或....) – cHao 2011-05-28 15:08:45

+0

通常情況下,如果異常是最好的 - 例外。檢查文件是否存在,如果創建後它仍然不存在,請將try/catch作爲後退。 – SK9 2011-09-30 02:12:22

160

我想知道的最好的方式,如果一個文件存在,實際上並沒有試圖打開它,如下:

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

希望幫助,再見!

+0

工程,我假設它比獲取InputStream來查看文件是否存在更有效。尼斯。 – 2012-03-01 12:08:04

+5

如果FILE_NAME =文件名+路徑怎麼辦? – 2012-07-27 23:18:04

+0

你是什麼意思? FILE_NAME應該是相對於應用程序的(未知)專用目錄的文件路徑。 FILE_NAME包含子目錄的事實對於測試它的存在不是問題;如果您必須創建該文件,則可以像往常一樣在Java中確保所需的子目錄[請參閱文檔](http://developer.android.com/reference/java/io/File.html#mkdirs()) – lencinhaus 2012-10-16 18:18:16

0

如果你想在任何情況下打開一個文件(即,如果它不存在,創建一個新的,如果它不追加到舊),你可以利用這一點,沒有必要的檢測:

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()); 
      } 
    } 
-2

我的建議是檢查文件的長度。 if file.length() returns 0這意味着文件不存在。

+9

可能有一個長度爲0的文件 – AaA 2012-08-30 08:57:21

5

隨着標準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(); 
} 
+0

Context.getExternalFilesDir()返回與Environment.getExternalStorageDirectory()。toString()+ APP_SD_PATH – riper 2013-04-03 17:19:05

1

(即,如果它不存在,創建一個新的,如果它不那麼就不要刪除它),然後使用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(); 
     } 

}