2010-05-07 18 views
46

próbuję otworzyć plik w android tak:Sprawdza czy plik istnieje

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) 
    { } 

, ale w przypadku, gdy plik nie istnieje plik nie znaleziono wyjątku. Chciałbym wiedzieć, jak mogę sprawdzić, czy plik istnieje przed próbą otwarcia.

+2

Jeśli to twój aktualny program obsługi wyjątku, należy go przemyśleć ponownie. http://www.rockstarprogrammer.org/post/2007/jun/15/empty-catch-blocks-are-always-wrong/ – Thomas

+0

@Thomas, który był kiedyś MOJĄ procedurą obsługi wyjątku dla klauzuli takiej jak ta (skopiowałam niektóre wykryj "Sieć." Wydaje mi się, że dobrą zasadą do kopiowania jest zbadanie wszystkiego, zanim faktycznie go użyjesz. Mam dość problemów z używaniem mojego kodu OWN. –

Odpowiedz

26

Dokumentacja mówi Context.openFileInput albo zwraca InputStream (plik znaleziono) lub rzuca FileNotFoundException (nie znaleziono)

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

więc wygląda na to wyjątek to "test".

Można również spróbować użyć standardowego

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

ale nie jest to zalecane. Context.openFileInput() i Context.openFileOutput() upewnij się, że pozostaniesz w kontekście przechowywania aplikacji na urządzeniu i że wszystkie twoje pliki zostaną usunięte po odinstalowaniu aplikacji.

+0

działa dobrze dla sprawdzenia, czy plik docelowy istnieje na karcie SD - dziękuję! – mishkin

+0

bardzo, bardzo dziękuję :) –

+0

Dlaczego nie jest to zalecane? –

2

dlaczego po prostu nie wychwycisz wyjątku FileNotFound i nie weźmiesz go za plik.

+0

Tak właśnie robię, ale zastanawiałem się, czy jest inny sposób. – rantravee

+0

@rantravee: Sposób, w jaki robisz, to złapać wszystkie wyjątki. Poza tym, że jest trochę zaniedbany, nie mówi też, dlaczego wystąpił wyjątek.Jeśli złapiesz tylko 'FileNotFoundException', będziesz wiedzieć, kiedy go złapiesz, że został zgłoszony, ponieważ plik nie istnieje (zamiast ogólnego wyjątku, który może oznaczać, że coś poszło nie tak z jakimś wywołaniem gdzieś w twoim bloku try lub rzeczy wywołuje lub wywołuje rzeczy, które wywołuje, lub ...). – cHao

+0

Generalnie najlepiej, jeśli wyjątki są po prostu wyjątkami. Sprawdź, czy plik istnieje, czy nie, i jeśli po jego utworzeniu niektóre z nich nadal nie istnieją, zatrzymaj próbę/catch jako cofnij. – SK9

160

Myślę, że najlepszym sposobem, aby wiedzieć, czy plik istnieje, bez faktycznie próbuje go otworzyć, jest następująca:

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

nadzieję, że pomoże, bye!

+0

Działa i zakładam, że jest to bardziej wydajne niż uzyskanie InputStream tylko po to, aby sprawdzić, czy plik istnieje. Miły. –

+5

Co jeśli FILE_NAME = nazwa_pliku + ścieżka? –

+0

co masz na myśli? Plik FILE_NAME powinien być ścieżką do pliku względem (nieznanego) prywatnego katalogu twojej aplikacji. Fakt, że FILE_NAME zawiera podkatalogi, nie stanowi problemu w testowaniu jego istnienia; jeśli musisz utworzyć ten plik, możesz zapewnić wymagane podkatalogi jak zwykle w Javie, [zobacz dokumenty] (http://developer.android.com/reference/java/io/File.html#mkdirs()) – lencinhaus

0

Jeśli chcesz otworzyć plik w każdym przypadku (czyli jeśli nie istnieje utworzyć nowy, jeśli nie dołączy do starej), można użyć tego, bez konieczności badania:

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

Moja sugestia to sprawdzenie długości pliku. if file.length() returns 0 oznacza to, że plik nie istnieje.

+9

Może istnieć plik o długości 0 – AaA

5

Przy standardowej java.io.File Jest to funkcja Stworzyłem i działa prawidłowo:

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() zwraca to samo, co Environment.getExternalStorageDirectory(). ToString() + APP_SD_PATH – riper

1

Jeśli chcesz się upewnić plik istnieje (czyli jeśli nie istnieje utworzyć nowy, jeśli to czy to nie wymazać go), a następnie użyć File.createNewFile:

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

np

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

} 
Powiązane problemy