Temporäre Dateien in Android erstellen

204

Was ist der beste Weg, um eine temporäre Datei in Android zu erstellen?

Kann File.createTempFile verwendet werden? Die Dokumentation ist sehr vage.

Insbesondere ist nicht klar, wann temporäre Dateien, mit File.createTempFiledenen erstellt wurde, gelöscht werden, wenn überhaupt.

hpique
quelle
Sie können mit diesem Thread im Stackoverflow beginnen, wo temporäre Dateien besprochen werden.
Benny Skogberg
Diese Google-Gruppendiskussion für Android-Entwickler könnte von Interesse sein: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Antworten:

286

Das mache ich normalerweise:

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

Was ihre Löschung betrifft, bin ich mir auch nicht ganz sicher. Da ich dies bei der Implementierung eines Caches verwende, lösche ich die ältesten Dateien manuell, bis die Größe des Cache-Verzeichnisses auf meinen voreingestellten Wert fällt.

Sparkymat
quelle
2
Das mache ich auch. Ich gehe davon aus, dass createTempFile keine echten temporären Dateien erstellt, es sei denn, es wird das Cache-Verzeichnis verwendet, dies ist jedoch nicht wirklich dokumentiert.
Hpique
Kann ich davon ausgehen, dass die Datei so lange erhalten bleibt, wie die App ausgeführt wird, auch wenn andere Apps ebenfalls ausgeführt werden und eigene temporäre Dateien erstellen?
Android-Entwickler
1
Jede App verwendet ihren eigenen Cache: Standardmäßig sind im internen Speicher gespeicherte Dateien für Ihre Anwendung privat und andere Anwendungen können nicht darauf zugreifen (und der Benutzer auch nicht). Wenn Sie einige Daten zwischenspeichern möchten, sollten Sie getCacheDir () verwenden, um eine Datei zu öffnen, in der Ihre Anwendung temporäre Cache-Dateien speichern soll. Wenn auf dem Gerät nur noch wenig interner Speicherplatz vorhanden ist, löscht Android diese Cache-Dateien möglicherweise, um Speicherplatz wiederherzustellen. Sie sollten sich jedoch nicht darauf verlassen, dass das System diese Dateien für Sie bereinigt. Quelle
felixd
Kann ich Share Intent verwenden, um diese Datei freizugeben?
Aks
4
Sie können outputFile.deleteOnExit () aufrufen. Theoretisch wird das System es bereinigen, wenn Ihre App beendet wird. Standardmethode in der Dateiklasse.
Dave Hubbard
90

Best Practices für interne und externe temporäre Dateien:

Interner Cache

Wenn Sie einige Daten zwischenspeichern möchten, anstatt sie dauerhaft zu speichern, sollten Sie getCacheDir()eine Datei öffnen, die das interne Verzeichnis darstellt, in dem Ihre Anwendung temporäre Cache-Dateien speichern soll.

Wenn auf dem Gerät nur noch wenig interner Speicherplatz vorhanden ist, löscht Android diese Cache-Dateien möglicherweise, um Speicherplatz wiederherzustellen. Sie sollten sich jedoch nicht darauf verlassen, dass das System diese Dateien für Sie bereinigt. Sie sollten die Cache-Dateien immer selbst verwalten und sich an einen angemessenen Platzbedarf halten, z. B. 1 MB. Wenn der Benutzer Ihre Anwendung deinstalliert, werden diese Dateien entfernt.

Externer Cache

Rufen Sie auf, um eine Datei zu öffnen, die das externe Speicherverzeichnis darstellt, in dem Sie Cache-Dateien speichern sollen getExternalCacheDir(). Wenn der Benutzer Ihre Anwendung deinstalliert, werden diese Dateien automatisch gelöscht.

Ähnlich wie ContextCompat.getExternalFilesDirs()oben erwähnt können Sie auch per Aufruf auf ein Cache-Verzeichnis in einem sekundären externen Speicher (falls verfügbar) zugreifen ContextCompat.getExternalCacheDirs().

Tipp: Um den Speicherplatz zu erhalten und die Leistung Ihrer App zu erhalten, ist es wichtig, dass Sie Ihre Cache-Dateien sorgfältig verwalten und diejenigen entfernen, die während des gesamten Lebenszyklus Ihrer App nicht mehr benötigt werden.

Mibollma
quelle
2
Dies beantwortet die Frage, was mit großen temporären Dateien zu tun ist, nicht angemessen. Was ist hier die beste Vorgehensweise? Ich vermute, es gibt keine andere, als einfach eine normale Datei zu verwalten.
Merk
35

Für temporäre interne Dateien stehen zwei Optionen zur Verfügung

1.

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

2.

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

Beide Optionen fügen Dateien im Anwendungs-Cache-Verzeichnis hinzu und können daher gelöscht werden, um bei Bedarf Speicherplatz zu schaffen. Bei Option 1 wird jedoch am Ende des Dateinamens eine Zufallszahl hinzugefügt, um die Dateien eindeutig zu halten. Es wird auch eine Dateierweiterung hinzugefügt, die .tmpstandardmäßig verwendet wird. Sie kann jedoch mithilfe des zweiten Parameters auf alles eingestellt werden. Die Verwendung der Zufallszahl bedeutet, dass sie trotz Angabe eines Dateinamens nicht gleich bleibt, wenn die Zahl zusammen mit dem Suffix / der Dateierweiterung ( .tmpstandardmäßig) hinzugefügt wird, z. B. wenn Sie Ihren Dateinamen als angeben internal_fileund als herauskommen internal_file1456345.tmp. Während Sie die Erweiterung angeben können, können Sie die hinzugefügte Nummer nicht angeben. Sie können jedoch den Dateinamen finden, über den er generiert wirdfile.getName();Sie müssten es jedoch irgendwo speichern, damit Sie es verwenden können, wann immer Sie möchten, um beispielsweise die Datei zu löschen oder zu lesen. Aus diesem Grund bevorzuge ich die 2. Option, da der von Ihnen angegebene Dateiname der erstellte Dateiname ist.

AdrenalineJunky
quelle
2
Kann ich davon ausgehen, dass die temporären Dateien nur gelöscht werden, wenn der App-Prozess nicht aktiv ist?
Android-Entwickler
2
@androiddeveloper Nr.
Guilherme Bernal
@ GuilhermeBernal Woher weißt du das? Hast du gesehen, wie es gelöscht wurde?
Android-Entwickler
1
@androiddeveloper Entschuldigung, dass Sie nicht früher Details angegeben haben. Ein Benutzer kann die App öffnen, dann zu den Einstellungen gehen, den Cache leeren und dann zur App zurückkehren, ohne sie töten zu lassen. Eine App kann also nicht davon ausgehen, dass die Cache-Datei nicht gelöscht wird, und nichts hält Android selbst davon ab, dies ohne Benutzerinteraktion zu tun.
Guilherme Bernal
14

Sie können das Cache- Verzeichnis mit context.getCacheDir () verwenden .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Macarse
quelle
10
File temp = File.createTempFile ("Präfix", "Suffix", context.getCacheDir ());
Patrick
Danke, ich habe es geschafft, aber meine Dateigröße ist gleich 0B. Wo liegt das Problem? Irgendwelche Ideen?
user7856586
0

Sie können die File.deleteOnExit()Methode verwenden

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

Es wird hier verwiesen ( https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

Kotucz
quelle
7
Es ist ziemlich nutzlos auf Android wegen des seltsamen Geschmacks der verwendeten JVM (es wird fast nie normal beendet)
Schwachstelle
1
Solange keine Leistungsprobleme bestehen, löschen, freigeben oder löschen Sie Daten sofort, wenn Sie sie nicht mehr benötigen.
Redwolf
0

Mach es einfach. Laut Dokumentation https://developer.android.com/training/data-storage/files

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

und löschen Sie es nach Gebrauch

picFile.delete()
Shivam Dawar
quelle