Creazione di file temporanei in Android


205

Qual è il modo migliore per creare un file temporaneo in Android?

File.createTempFile può essere utilizzato? La documentazione è molto vaga al riguardo.

In particolare, non è chiaro quando i file temporanei creati con File.createTempFilevengono eliminati, se mai.


È possibile iniziare con questo thread in StackOverflow, dove vengono discussi i file temporanei.
Benny Skogberg,

Questa discussione di gruppo su Google per sviluppatori Android potrebbe essere di interesse: groups.google.com/group/android-developers/browse_thread/thread/…
hpique il

Risposte:


287

Questo è ciò che faccio in genere:

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

Per quanto riguarda la loro cancellazione, non ne sono nemmeno sicuro. Dato che lo utilizzo nella mia implementazione di una cache, elimino manualmente i file più vecchi fino a quando la dimensione della directory della cache non scende al mio valore predefinito.


2
Questo è anche quello che faccio. La mia ipotesi è che createTempFile non crei file temporanei reali a meno che non utilizzi la directory cache, ma ciò non è documentato.
hpique,

posso supporre che il file rimarrà finché l'app è in esecuzione, anche se anche altre app vengono eseguite e creano i propri file temporanei?
sviluppatore Android il

1
Ogni app utilizza la propria cache: per impostazione predefinita, i file salvati nella memoria interna sono privati ​​per l'applicazione e altre applicazioni non possono accedervi (né l'utente). Se si desidera memorizzare nella cache alcuni dati, è necessario utilizzare getCacheDir () per aprire un file in cui l'applicazione deve salvare i file temporanei della cache. Quando il dispositivo ha poco spazio di archiviazione interno, Android può eliminare questi file di cache per recuperare spazio. Tuttavia, non dovresti fare affidamento sul sistema per ripulire questi file per te. Fonte
felixd,

Posso usare l'intento di condivisione per condividere questo file?
accetta il

4
Puoi chiamare outputFile.deleteOnExit (). In teoria, il sistema lo pulirà all'uscita dall'app. Metodo standard in classe File.
Dave Hubbard,

90

Best practice sui file temporanei interni ed esterni :

Cache interna

Se si desidera memorizzare nella cache alcuni dati, anziché archiviarli in modo persistente, è necessario utilizzare getCacheDir()per aprire un file che rappresenta la directory interna in cui l'applicazione deve salvare i file di cache temporanei.

Quando il dispositivo ha poco spazio di archiviazione interno, Android può eliminare questi file di cache per recuperare spazio. Tuttavia, non dovresti fare affidamento sul sistema per ripulire questi file per te. Dovresti sempre conservare tu stesso i file della cache e rimanere entro un limite ragionevole di spazio consumato, ad esempio 1 MB. Quando l'utente disinstalla l'applicazione, questi file vengono rimossi.

Cache esterna

Per aprire un file che rappresenta la directory di archiviazione esterna in cui è necessario salvare i file della cache, chiamare getExternalCacheDir(). Se l'utente disinstalla l'applicazione, questi file verranno automaticamente eliminati.

Simile a ContextCompat.getExternalFilesDirs(), menzionato sopra, è anche possibile accedere a una directory della cache su una memoria esterna secondaria (se disponibile) chiamando ContextCompat.getExternalCacheDirs().

Suggerimento: per preservare lo spazio dei file e mantenere le prestazioni della tua app, è importante gestire attentamente i file della cache e rimuovere quelli che non sono più necessari durante il ciclo di vita della tua app.


2
Ciò non risponde adeguatamente alla domanda su cosa fare con file temporanei di grandi dimensioni. Qual è la migliore pratica qui? Sospetto che non ce ne sia uno, a parte la semplice gestione di un file normale.
Merk,

35

Per i file interni temporanei sono disponibili 2 opzioni

1.

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

2.

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

Entrambe le opzioni aggiungono file nella directory della cache delle applicazioni e quindi possono essere cancellate per fare spazio come richiesto ma l'opzione 1 aggiungerà un numero casuale alla fine del nome file per mantenere i file univoci. Aggiungerà anche un'estensione di file che è .tmpdi default, ma può essere impostata su qualsiasi cosa tramite l'uso del secondo parametro. L'uso del numero casuale significa che, nonostante la specifica di un nome file, non rimanga uguale al numero aggiunto insieme all'estensione del suffisso / file ( .tmpper impostazione predefinita), ad esempio si specifica il nome del file come internal_fileed esce come internal_file1456345.tmp. Mentre è possibile specificare l'estensione, non è possibile specificare il numero che viene aggiunto. Puoi comunque trovare il nome del file che genera tramitefile.getName();, ma è necessario memorizzarlo da qualche parte in modo da poterlo utilizzare ogni volta che si desidera, ad esempio, per eliminare o leggere il file. Pertanto, per questo motivo, preferisco la seconda opzione poiché il nome file specificato è il nome file creato.


2
Posso presumere che i file temporanei vengano eliminati solo quando il processo dell'app non è attivo?
sviluppatore Android

2
@androiddeveloper No.
Guilherme Bernal,

@GuilhermeBernal Come lo sai? L'hai visto essere cancellato?
sviluppatore Android il

1
@androiddeveloper Ci scusiamo per non aver fornito dettagli in precedenza. Un utente può aprire l'app, quindi andare alle impostazioni, svuotare la cache e quindi tornare all'app, il tutto senza averlo ucciso. Quindi un'app non può presumere che il file della cache non verrà eliminato e nulla impedisce a Android stesso di farlo senza l'interazione dell'utente.
Guilherme Bernal,

14

È possibile utilizzare la directory cache utilizzando context.getCacheDir () .

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

10
File temp = File.createTempFile ("prefisso", "suffisso", context.getCacheDir ());
Patrick,

Grazie, l'ho fatto, ma la mia dimensione del file è uguale a 0B, dov'è il problema, qualche idea?
user7856586

1

7
È praticamente inutile su Android a causa dello strano sapore di JVM utilizzato (non si chiude quasi mai normalmente)
debolezza,

1
Finché non ci sono problemi di prestazioni, eliminare, liberare o rilasciare i dati immediatamente, quando non sono più necessari.
Redwolf,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.