2010-08-06 14 views
170

Jaki jest najlepszy sposób, aby utworzyć plik tymczasowy w Android?tworzenia plików tymczasowych w Androidzie

Czy File.createTempFile być używany? Dokumentacja jest bardzo niejasna.

W szczególności nie jest jasne, kiedy pliki tymczasowe tworzone z File.createTempFile są usuwane, jeśli w ogóle.

+0

Ta Android Developers grupy dyskusyjne Google może być interesujące : http://groups.google.com/group/android-developers/browse_thread/thread/b59af1a9940b87df?pli=1 – hpique

+0

Możesz zacząć od [tego wątku] (http://stackoverflow.com/questions/1431042/problem- in-creation-temporary-file-in-android) w stackoverflow, gdzie omawiane są pliki tymczasowe. –

Odpowiedz

223

To, co zwykle zrobić:

File outputDir = context.getCacheDir(); // context being the Activity pointer 
File outputFile = File.createTempFile("prefix", "extension", outputDir); 

chodzi o ich usunięcie, nie jestem pewien, czy zakończyć. Ponieważ używam tego w mojej implementacji pamięci podręcznej, ręcznie usuwam najstarsze pliki, dopóki rozmiar katalogu pamięci podręcznej nie spadnie do ustawionej wartości.

+1

To też robię. Moje założenie jest takie, że createTempFile nie tworzy prawdziwych plików tymczasowych, chyba że używa katalogu pamięci podręcznej, ale to nie jest naprawdę udokumentowane. – hpique

+0

Czy mogę założyć, że plik pozostanie tak długo, jak aplikacja działa, nawet jeśli inne aplikacje również uruchamiają i tworzą własne pliki tymczasowe? –

+0

Każda aplikacja korzysta z własnej pamięci podręcznej: domyślnie pliki zapisane w pamięci wewnętrznej są prywatne dla aplikacji, a inne aplikacje nie mają do nich dostępu (ani użytkownik). Jeśli chcesz cache niektóre dane, należy użyć getCacheDir(), aby otworzyć plik, w którym aplikacja powinna zapisywać tymczasowe pliki pamięci podręcznej. Gdy na urządzeniu jest mało miejsca w pamięci wewnętrznej, system Android może usunąć te pliki pamięci podręcznej, aby zwolnić miejsce. Jednak nie powinieneś polegać na systemie, aby wyczyścić te pliki. [Źródło] (http://developer.android.com/guide/topics/data/data-storage.html#filesInternal) – felixd

12

Można użyć dir cache używając context.getCacheDir().

File temp=File.createTempFile("prefix","suffix",context.getCacheDir()); 
+10

Temp. Pliku = File.createTempFile ("przedrostek", "przyrostek", kontekst.getCacheDir()); – Patrick

82

najlepszych praktyk w zakresie internal i external pliki tymczasowe:

Internal Cache

Jeśli chcesz buforować niektóre dane, zamiast przechowywać je wytrwale, należy użyć getCacheDir() aby otworzyć Plik reprezentujący wewnętrzny katalog , w którym aplikacja powinna zapisywać tymczasowe pliki pamięci podręcznej .

Gdy urządzenie jest niska na wewnętrznej powierzchni magazynowej, Android może usuwać te pliki cache odzyskać przestrzeń. Jednak nie powinieneś polegać na systemie, aby oczyścić te pliki za Ciebie. Powinieneś zawsze przechowywać pliki pamięci podręcznej samodzielnie i pozostawać w rozsądnym limicie przestrzeni zużyty, na przykład 1 MB. Gdy użytkownik odinstaluje Twoją aplikację, te pliki zostaną usunięte.

External Cache

Aby otworzyć plik, który reprezentuje zewnętrzny katalog przechowywania gdzie należy zapisać pliki cache, zadzwoń getExternalCacheDir(). Jeśli użytkownik odinstaluje Twoją aplikację, pliki te zostaną automatycznie usunięte z wersji .

podobne do ContextCompat.getExternalFilesDirs(), wspomniano powyżej, można również uzyskać dostęp do katalogu pamięci podręcznej na wtórnym pamięci zewnętrznej (jeśli są dostępne), wywołując ContextCompat.getExternalCacheDirs().

Wskazówka: Aby zachować miejsca plików i utrzymać wydajność aplikacji, to ważne, aby starannie zarządzać plikami cache i usuń te , które nie są już potrzebne w całym cyklu życia aplikacji.

+0

To nie odpowiada na pytanie, co zrobić z dużymi plikami tymczasowymi. Jaka jest tutaj najlepsza praktyka? Podejrzewam, że nie ma żadnego, poza zwykłym zarządzaniem zwykłym plikiem. – Merk

25

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 może być wyczyszczone, aby zrobić miejsce w razie potrzeby, ale opcja 1 doda losową liczbę koniec nazwy pliku, aby zachować unikalne pliki. Dodaje również domyślnie rozszerzenie pliku, które jest domyślnie ustawione na .tmp, ale można je ustawić dowolnie za pomocą drugiego parametru. Używanie losowej liczby oznacza, że ​​pomimo podania nazwy pliku nie pozostaje ona taka sama jak liczba dodawana wraz z przyrostkiem/rozszerzeniem pliku (domyślnie .tmp) np. Podasz swoją nazwę pliku jako internal_file i wychodzi jako internal_file1456345.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 niej korzystać za każdym razem, gdy 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

Czy mogę założyć, że pliki tymczasowe zostaną usunięte tylko wtedy, gdy proces aplikacji nie jest żywy? –

+0

@androiddeveloper No. –

+0

@GuilhermeBernal Skąd to wiesz? Czy widziałeś, że został usunięty? –

0
+4

Jest prawie bezużyteczne na Androidzie z powodu dziwnego smaku używanej maszyny JVM (prawie nigdy nie kończy się normalnie) – nekavally

+0

Tak długo, jak nie ma żadnych obaw związanych z wydajnością, usuwanie, bezpłatne lub natychmiast upuść dane, gdy już ich nie potrzebujesz. – Redwolf

Powiązane problemy