2013-06-17 26 views
35

W mojej aplikacji dodałem możliwość dodawania i zapisywania zdjęć na co dzień, reprezentowanych przez Fragment.File.createTempFile() VS nowy plik()

Aby zapisać obraz na karcie SD, Używam obecnie funkcję File.createTempFile:

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir()); 

I rzeczywiście próbował również ze standardowym sposób:

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX); 

oboje pracują, ale w moim przypadku pierwsza jest lepsza od drugiej, ponieważ funkcja createTempFile dodaje długą losową liczbę na końcu nazwy pliku, czyniąc ją unikalną.

Aby dać przykład, tutaj jest to, co mam z obu metod:

Z createTempFile: IMG_2013-06-18_-1961144729.jpg

Z nowy plik: IMG_2013-06-18_.jpg

Wreszcie moje pytanie brzmi, czy można bezpiecznie używać createTempFile do zapisywania moich zdjęć lub czy muszę używać standardowego sposobu i dodawać kod, aby wygenerować niepowtarzalną nazwę pliku? Czy powinien być używany tylko do plików tymczasowych?

Przejrzałem dokumentację dotyczącą funkcji, ale nie znalazłem nic o możliwych konsekwencjach jej użycia zamiast new File.

Dziękuję

Odpowiedz

15

Brzmi jak aplikacja tworzy pliki, więc trzeba zagwarantować unikalnych nazw plików. Możesz zachować jakiś rodzaj licznika w swojej aplikacji (zapisany w preferencjach lub DB) i użyć tego. Następnie możesz tworzyć krótsze/bardziej kontrolowane nazwy i samodzielnie kontrolować wyjątkowość. Lub możesz użyć funkcji createTempFile(), która zagwarantuje ci uzyskanie unikalnej nazwy pliku (ale uzyskasz tylko częściową kontrolę nad nazwą pliku). Wygląda na to, że wolisz createTempFile(), więc nie ma powodu, by nie używać go dalej, jeśli jesteś zadowolony z wygenerowanych przez niego nazw plików. Nie ma słabszej strony, oprócz braku pełnej kontroli nad formatem nazwy pliku.

+0

Tak, 'createTempFile' daje mi wyniki, które chcę, ale moje pytanie brzmi: czy można bezpiecznie korzystać z tej funkcji, podczas gdy w rzeczywistości wydaje się, że jest przeznaczona tylko do tworzenia plików tymczasowych. –

+1

Tak, jest bezpieczny. Ponownie, tylko wadą/różnicą jest to, że nie masz pełnej kontroli nad nazwą pliku. – user1676075

+0

Ok, będę go dalej używał, dziękuję za wyjaśnienie! –

11

przypadku tymczasowych plików wewnętrznych ich są 2 opcje

1.

File file; 
file = File.createTempFile(filename, null, this.getCacheDir()); 

2.

File file 
file = new File(this.getCacheDir(), filename); 

Obie opcje dodaje pliki w katalogu pamięci podręcznej aplikacji, a tym samym mogą być usunięte, aby w razie potrzeby, ale opcja 1 doda losową liczbę na końcu nazwy pliku, aby zachować unikatowe pliki. Dodaje również rozszerzenie pliku, które jest domyślnie .tmp, ale może być ustawione na wszystko za pomocą drugiego parametru. Użycie liczby losowej oznacza, że ​​pomimo podania nazwy pliku nie pozostaje ona taka sama jak liczba dodawana wraz z rozszerzeniem/rozszerzeniem pliku (domyślnie .tmp), np. Podajesz nazwę pliku jako plik_wewnętrzny i wychodzi jako plik_ wewnętrzny1456345.tmp . Podczas gdy możesz określić rozszerzenie, nie możesz podać numeru, który jest dodawany. Możesz jednak znaleźć nazwę pliku wygenerowaną przez file.getName(); ale musisz go gdzieś przechowywać, abyś mógł z niego korzystać, kiedy tylko chcesz na przykład usunąć lub przeczytać plik. Dlatego z tego powodu wolę drugą opcję, ponieważ nazwa pliku, którą określasz, jest nazwą pliku, który został utworzony.

+1

Uwaga: tworzenie plików tymczasowych w pamięci podręcznej nie będzie działać dla [określonych działań] (http://stackoverflow.com/questions/18711525/camera-not-working-saving-when-using-cache-uri-as-mediastore- dodatkowe wyjście) – Atul

+0

@Atul, dobrze działa (przynajmniej teraz), wystarczy użyć FileProvider. – helleye

7

1. Utwórz plik o losowej nazwie

File file = File.createTempFile(String prefix, String suffix, File parent) 
  • Właściwie utworzyć plik na dysku i zwraca obiekt pliku
  • Utwórz nazwę pliku w tym formacie: przedrostek + liczbę losową + przyrostek
  • Przydatne, gdy potrzebujesz utworzyć plik tymczasowy na dysku

2. Utwórz plik z dokładną nazwę

File file = new File(File parent, String child); 
file.createNewFile(); 
  • Właściwie utworzyć plik na dysku i zwraca true, jeśli plik się pomyślnie utworzony

  • Nazwa pliku będzie dokładnie tak, jak przejściu do parametru dziecięcej

  • Przydatne, gdy potrzebujesz utworzyć stały plik na dysku

3. Utwórz tylko obiekt pliku (w pamięci)

File file = new File(File parent, String child); 
// doesn't create the file on disk until calling createNewFile() method 
  • tworzyć tylko w pamięci, a nie faktycznie na dysku
  • przydatne, gdy trzeba po prostu utworzyć obiekt pliku (np prostu go zdać jako parametr)

parent parametr może być jeden z następujących objawów:

  1. App prywatne katalogi

    • context.getCacheDir()
    • context.getExternalCacheDir()
    • i ... (pełna lista znajduje się here)
  2. publiczny katalogi:

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory ( Environment.DIRECTORY_PICTURES)
    • i ... (pełna lista znajduje się here)
+3

Doskonałe formatowanie odpowiedzi. +1 –