Crear archivos temporales en Android

205

¿Cuál es la mejor manera de crear un archivo temporal en Android?

¿Se puede usar File.createTempFile ? La documentación es muy vaga al respecto.

En particular, no está claro cuándo File.createTempFilese eliminan los archivos temporales creados con , si alguna vez.

hpique
fuente
Podría comenzar con este hilo en stackoverflow, donde se discuten los archivos temporales.
Benny Skogberg
Esta discusión grupal de desarrolladores de Android de Google podría ser de interés: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Respuestas:

287

Esto es lo que normalmente hago:

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

En cuanto a su eliminación, tampoco estoy completamente seguro. Como uso esto en mi implementación de un caché, elimino manualmente los archivos más antiguos hasta que el tamaño del directorio de caché se reduce a mi valor preestablecido.

sparkymat
fuente
2
Eso es lo que hago yo también. Mi suposición es que createTempFile no crea archivos temporales reales a menos que use el directorio de caché, pero esto realmente no está documentado.
hpique
¿Puedo suponer que el archivo permanecerá mientras la aplicación se esté ejecutando, incluso si otras aplicaciones también se ejecutan y crean sus propios archivos temporales?
Desarrollador de Android
1
Cada aplicación usa su propio caché: de manera predeterminada, los archivos guardados en el almacenamiento interno son privados para su aplicación y otras aplicaciones no pueden acceder a ellos (ni el usuario). Si desea almacenar en caché algunos datos, debe usar getCacheDir () para abrir un archivo donde su aplicación debe guardar archivos temporales de caché. Cuando el dispositivo tiene poco espacio de almacenamiento interno, Android puede eliminar estos archivos de caché para recuperar espacio. Sin embargo, no debe confiar en el sistema para limpiar estos archivos por usted. Fuente
felixd
¿Puedo usar la intención de compartir para compartir este archivo?
aks
44
Puede llamar a outputFile.deleteOnExit (). En teoría, el sistema lo limpiará cuando su aplicación salga. Método estándar en la clase de archivo.
Dave Hubbard el
90

Mejores prácticas en archivos temporales internos y externos :

Caché interna

Si desea almacenar en caché algunos datos, en lugar de almacenarlos de forma persistente, debe usar getCacheDir()para abrir un archivo que represente el directorio interno donde su aplicación debe guardar archivos temporales de caché.

Cuando el dispositivo tiene poco espacio de almacenamiento interno, Android puede eliminar estos archivos de caché para recuperar espacio. Sin embargo, no debe confiar en el sistema para limpiar estos archivos por usted. Siempre debe mantener los archivos de caché usted mismo y mantenerse dentro de un límite razonable de espacio consumido, como 1 MB. Cuando el usuario desinstala su aplicación, estos archivos se eliminan.

Caché externa

Para abrir un archivo que representa el directorio de almacenamiento externo donde debe guardar los archivos de caché, llame getExternalCacheDir(). Si el usuario desinstala su aplicación, estos archivos se eliminarán automáticamente.

Similar a ContextCompat.getExternalFilesDirs(), mencionado anteriormente, también puede acceder a un directorio de caché en un almacenamiento externo secundario (si está disponible) llamando ContextCompat.getExternalCacheDirs().

Consejo: para preservar el espacio de archivos y mantener el rendimiento de su aplicación, es importante que administre cuidadosamente sus archivos de caché y elimine los que ya no son necesarios durante el ciclo de vida de su aplicación.

mibollma
fuente
2
Esto no responde adecuadamente a la pregunta de qué hacer con archivos temporales grandes. ¿Cuál es la mejor práctica aquí? Sospecho que no hay uno, aparte de simplemente administrar un archivo normal.
Merk
35

Para archivos internos temporales hay 2 opciones

1)

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

2)

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

Ambas opciones agregan archivos en el directorio de caché de las aplicaciones y, por lo tanto, se pueden borrar para hacer espacio según sea necesario, pero la opción 1 agregará un número aleatorio al final del nombre de archivo para mantener los archivos únicos. También agregará una extensión de archivo que es .tmppredeterminada, pero se puede establecer en cualquier cosa mediante el uso del segundo parámetro. El uso del número aleatorio significa que, a pesar de especificar un nombre de archivo, no permanece igual, ya que el número se agrega junto con la extensión de sufijo / archivo ( .tmppor defecto), por ejemplo, especifica su nombre de archivo como internal_filey sale como internal_file1456345.tmp. Mientras que puede especificar la extensión, no puede especificar el número que se agrega. Sin embargo, puede encontrar el nombre de archivo que genera a través defile.getName();, pero necesitaría almacenarlo en algún lugar para poder usarlo cuando lo desee, por ejemplo, para eliminar o leer el archivo. Por lo tanto, por esta razón, prefiero la segunda opción, ya que el nombre de archivo que especifique es el nombre de archivo que se crea.

AdrenalinaJunky
fuente
2
¿Puedo suponer que los archivos temporales solo se eliminarán cuando el proceso de la aplicación no esté activo?
Desarrollador de Android
2
@androiddeveloper No.
Guilherme Bernal
@GuilhermeBernal ¿Cómo sabes eso? ¿Lo has visto eliminarse?
Desarrollador de Android
1
@androiddeveloper Lo siento por no dar detalles antes. Un usuario puede abrir la aplicación, luego ir a la configuración, borrar su caché y luego volver a la aplicación, todo sin que se elimine. Por lo tanto, una aplicación no puede asumir que el archivo de caché no se eliminará y nada impide que el propio Android lo haga sin la interacción del usuario.
Guilherme Bernal
14

Puede usar el directorio de caché usando context.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Macarse
fuente
10
Archivo temp = File.createTempFile ("prefijo", "sufijo", context.getCacheDir ());
Patrick
Gracias, lo hice, pero el tamaño de mi archivo es igual a 0B, donde está el problema, ¿alguna idea?
user7856586
1

Puedes usar el File.deleteOnExit()método

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

Se hace referencia aquí https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

kotucz
fuente
77
Es bastante inútil en Android debido al extraño sabor de JVM utilizado (casi nunca termina normalmente)
weaknespase
1
Mientras no haya problemas de rendimiento, elimine, libere o suelte los datos inmediatamente, cuando ya no los necesite.
Redwolf
0

Hazlo de manera simple. De acuerdo con la documentación https://developer.android.com/training/data-storage/files

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

y eliminarlo después del uso

picFile.delete()
Shivam Dawar
fuente