2010-08-06 2 views
170

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

È possibile utilizzare File.createTempFile? La documentazione è molto vaga a riguardo.

In particolare, non è chiaro quando i file temporanei creati con File.createTempFile vengono cancellati, se mai.

+0

Questo gruppo di discussione di Google Android Developers potrebbe essere di interesse : http://groups.google.com/group/android-developers/browse_thread/thread/b59af1a9940b87df?pli=1 – hpique

+0

Si potrebbe iniziare con [questo thread] (http://stackoverflow.com/questions/1431042/problem- in-create-temporary-file-in-android) in stackoverflow, dove vengono discussi i file temporanei. –

risposta

223

Questo è quello che faccio di solito:

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

Per quanto riguarda la cancellazione, io non sono sicuro neanche completare. Dal momento che lo uso nella mia implementazione di una cache, elimino manualmente i file più vecchi finché la dimensione della directory della cache non scende al mio valore preimpostato.

+1

Questo è quello che faccio pure io. La mia ipotesi è che createTempFile non crei file temporanei reali a meno che non usi la directory cache, ma questo non è realmente documentato. – hpique

+0

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

+0

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 può). 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 è in esaurimento spazio di archiviazione interno, Android può eliminare questi file cache per recuperare spazio. Tuttavia, non dovresti fare affidamento sul sistema per pulire questi file per te. [Source] (http://developer.android.com/guide/topics/data/data-storage.html#filesInternal) – felixd

12

È 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

82

migliori pratiche in materia di internal e external file temporanei:

Internal Cache

Se desideri memorizzare nella cache alcuni dati, piuttosto che conservarla con insistenza, si dovrebbe usare per aprire un getCacheDir() File che rappresenta la directory interna in cui l'applicazione deve salvare i file temporanei della cache .

Quando il dispositivo è in esaurimento spazio di archiviazione interno, Android può eliminare questi file cache per recuperare spazio. Tuttavia, non devi fare affidamento sul sistema per pulire questi file. Dovresti sempre conservare i file della cache e rimanere entro un ragionevole limite di spazio consumato, ad esempio 1 MB. Quando l'utente disinstalla l'applicazione, questi file vengono rimossi.

External Cache

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

Simile a ContextCompat.getExternalFilesDirs(), di cui sopra, è anche possibile accedere a una directory di cache su uno storage esterno secondario (se disponibili) chiamando ContextCompat.getExternalCacheDirs().

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

+0

Questo 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, oltre alla semplice gestione di un file normale. – Merk

25

Per i file interni temporanei loro sono 2 opzioni

1.

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

2.

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

entrambe le opzioni aggiunge i file nella directory della cache applicazioni e quindi può essere cancellato per fare spazio come richiesto, ma l'opzione 1 aggiungerà un numero casuale su la fine del nome del file per mantenere i file unici. Aggiungerà anche un'estensione di file che è .tmp per impostazione predefinita, ma può essere impostata su qualsiasi cosa tramite l'uso del secondo parametro. L'uso del numero casuale significa che nonostante si specifichi un nome file esso non rimane uguale al numero aggiunto insieme all'estensione suffisso/file (.tmp per impostazione predefinita), ad es. Si specifica il nome file come internal_file e viene indicato 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 tramite file.getName();, ma dovrai salvarlo da qualche parte in modo da poterlo utilizzare ogni volta che desideri, ad esempio, per eliminare o leggere il file. Pertanto per questo motivo preferisco la seconda opzione poiché il nome file che specifichi è il nome del file che viene creato.

+1

Posso supporre che i file temporanei verranno eliminati solo quando il processo dell'app non è attivo? –

+0

@androiddeveloper No. –

+0

@GuilhermeBernal Come lo sai? Hai visto che viene cancellato? –

0

È possibile utilizzare il metodo File.deleteOnExit()

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

Si fa riferimento qui https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String, java.lang.String, java.io.File)

+4

È praticamente inutile su Android a causa dello strano sapore di JVM utilizzato (non è quasi mai terminato normalmente) – nekavally

+0

Finché non ci sono problemi di prestazioni, cancella, libera o rilasciare i dati immediatamente, quando non ne hai più bisogno. – Redwolf