Tworzenie plików tymczasowych w systemie Android

204

Jaki jest najlepszy sposób na utworzenie pliku tymczasowego w systemie Android?

Czy można użyć File.createTempFile ? Dokumentacja jest bardzo niejasna.

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

hpique
źródło
Możesz zacząć od tego wątku w stosie przepływu, w którym omawiane są pliki tymczasowe.
Benny Skogberg,
Dyskusja grupowa Google Developers Android Developers może być interesująca: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Odpowiedzi:

286

Oto co zazwyczaj robię:

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

Jeśli chodzi o ich usunięcie, nie jestem również pewien. Ponieważ używam tego w mojej implementacji pamięci podręcznej, ręcznie usuwam najstarsze pliki, aż rozmiar katalogu pamięci podręcznej spadnie do mojej wstępnie ustawionej wartości.

Sparkymat
źródło
2
Tak też robię. Zakładam, że createTempFile nie tworzy prawdziwych plików tymczasowych, chyba że użyje katalogu bufora, ale tak naprawdę nie zostało to udokumentowane.
hpique
czy mogę założyć, że plik pozostanie tak długo, jak aplikacja będzie działać, nawet jeśli inne aplikacje również działają i tworzą własne pliki tymczasowe?
programista Androida
1
Każda aplikacja korzysta z własnej pamięci podręcznej: domyślnie pliki zapisane w pamięci wewnętrznej są prywatne dla Twojej aplikacji, a inne aplikacje nie mogą do nich uzyskać dostępu (ani użytkownik). Jeśli chcesz buforować niektóre dane, powinieneś użyć getCacheDir (), aby otworzyć plik, w którym aplikacja powinna zapisać tymczasowe pliki pamięci podręcznej. Gdy w urządzeniu brakuje wewnętrznej pamięci, Android może usunąć te pliki pamięci podręcznej, aby odzyskać miejsce. Jednak nie powinieneś polegać na systemie, który czyści te pliki. Źródło
felixd
Czy mogę użyć zamiaru udostępniania, aby udostępnić ten plik?
aks
4
Możesz wywołać outputFile.deleteOnExit (). Teoretycznie system wyczyści go po zamknięciu aplikacji. Metoda standardowa w klasie plików.
Dave Hubbard
90

Najlepsze praktyki dotyczące wewnętrznych i zewnętrznych plików tymczasowych:

Wewnętrzna pamięć podręczna

Jeśli chcesz buforować niektóre dane, zamiast przechowywać je trwale, powinieneś użyć getCacheDir()do otwarcia pliku reprezentującego wewnętrzny katalog, w którym aplikacja powinna zapisać tymczasowe pliki pamięci podręcznej.

Gdy w urządzeniu brakuje wewnętrznej pamięci, Android może usunąć te pliki pamięci podręcznej, aby odzyskać miejsce. Jednak nie powinieneś polegać na systemie, który czyści te pliki. Zawsze powinieneś sam utrzymywać pliki pamięci podręcznej i pozostawać w rozsądnym limicie zajętego miejsca, takim jak 1 MB. Gdy użytkownik odinstaluje aplikację, pliki te zostaną usunięte.

Zewnętrzna pamięć podręczna

Aby otworzyć plik reprezentujący katalog pamięci zewnętrznej, w którym należy zapisać pliki pamięci podręcznej, zadzwoń getExternalCacheDir(). Jeśli użytkownik odinstaluje aplikację, pliki te zostaną automatycznie usunięte.

Podobnie jak ContextCompat.getExternalFilesDirs()wspomniano powyżej, można również uzyskać dostęp do katalogu pamięci podręcznej na dodatkowej pamięci zewnętrznej (jeśli jest dostępny), dzwoniąc ContextCompat.getExternalCacheDirs().

Wskazówka: Aby zachować przestrzeń plików i utrzymać wydajność aplikacji, ważne jest staranne zarządzanie plikami pamięci podręcznej i usuwanie tych, które nie są już potrzebne przez cały cykl życia aplikacji.

mibollma
źródło
2
Nie odpowiada to odpowiednio na pytanie, co zrobić z dużymi plikami tymczasowymi. Jaka jest tutaj najlepsza praktyka? Podejrzewam, że nie ma innego niż zwykłe zarządzanie zwykłym plikiem.
Merk
35

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

1.

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

2)

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

Obie opcje dodają pliki do katalogu pamięci podręcznej aplikacji, dzięki czemu można je wyczyścić, aby zrobić miejsce w razie potrzeby, ale opcja 1 doda losową liczbę na końcu nazwy pliku, aby pliki były unikalne. Dodaje również rozszerzenie pliku, które jest .tmpdomyślnie, ale można ustawić na dowolne za pomocą drugiego parametru. Użycie liczby losowej oznacza, że ​​pomimo podania nazwy pliku nie pozostaje ona taka sama, jak liczba dodawana wraz z sufiksem / rozszerzeniem pliku ( .tmpdomyślnie), np. Określasz swoją nazwę jako internal_filei wychodzi jako internal_file1456345.tmp. Podczas gdy możesz określić rozszerzenie, nie możesz podać liczby, która zostanie dodana. Możesz jednak znaleźć nazwę pliku, który generujefile.getName();, ale trzeba go gdzieś przechowywać, aby można było z niego korzystać w dowolnym momencie, na przykład w celu usunięcia lub odczytania pliku. Dlatego z tego powodu wolę drugą opcję, ponieważ nazwa pliku, którą określasz, to nazwa pliku, który jest tworzony.

Adrenalina Śmieci
źródło
2
Czy mogę założyć, że pliki tymczasowe zostaną usunięte tylko wtedy, gdy proces aplikacji nie jest aktywny?
programista Androida
2
@ androiddeveloper No.
Guilherme Bernal
@GuilhermeBernal Skąd to wiesz? Czy widziałeś, jak się usuwa?
programista Androida
1
@androiddeveloper Przepraszam, że nie podałem wcześniej szczegółów. Użytkownik może otworzyć aplikację, a następnie przejść do ustawień, wyczyścić pamięć podręczną, a następnie wrócić do aplikacji, nie zabijając jej. Dlatego aplikacja nie może założyć, że plik pamięci podręcznej nie zostanie usunięty i nic nie powstrzyma androida przed zrobieniem tego bez interakcji użytkownika.
Guilherme Bernal
14

Możesz użyć katalogu pamięci podręcznej za pomocą kontekstu.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Makaron
źródło
10
Temp pliku = File.createTempFile („prefiks”, „sufiks”, context.getCacheDir ());
Patrick
Dzięki, zrobiłem to, ale mój rozmiar pliku wynosi 0B, gdzie jest problem, jakieś pomysły?
user7856586
0

Możesz użyć tej File.deleteOnExit()metody

https://developer.android.com/reference/java/io/File.html#deleteOnExit ()

Znajduje się tutaj https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

kotucz
źródło
7
Jest prawie bezużyteczny na Androidzie z powodu dziwnego smaku JVM (prawie nigdy nie kończy się normalnie)
słabypas
1
Tak długo, jak nie ma problemów z wydajnością, usuń, zwolnij lub upuść dane natychmiast, gdy już ich nie potrzebujesz.
Redwolf,
0

Zrób to w prosty sposób. Zgodnie z dokumentacją https://developer.android.com/training/data-storage/files

String imageName = "IMG_" + String.valueOf(System.currentTimeMillis()) +".jpg";
        picFile = new File(ProfileActivity.this.getCacheDir(),imageName);

i usuń go po użyciu

picFile.delete()
Shivam Dawar
źródło