File.createTempFile () VS new File()


En mi aplicación he añadido la posibilidad de añadir y guardar imágenes para el día a día, representado por un Fragment.

Para guardar la imagen en la tarjeta SD, actualmente uso la función File.createTempFile:

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir());

En realidad también lo intenté con la forma estándar:

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX);

Ambos funcionan, pero en mi caso el primero es mejor que el segundo porque la función createTempFile agrega un número aleatorio largo al final del nombre del archivo haciéndolo único.

Para darle un ejemplo, esto es lo que obtengo con ambos métodos:

Con createTempFile: IMG_2013-06-18_-1961144729.jpg

Con nuevo Archivo: IMG_2013-06-18_.jpg

Finalmente mi pregunta es, ¿es seguro seguir usando createTempFile para guardar mis imágenes o tengo que usar la forma estándar y agregar algún código para generar un nombre de archivo único? ¿Debería usarse solo para archivos temporales?

Revisé la documentación sobre la función pero no encontré nada sobre las posibles consecuencias de usarla en lugar de new File.

Gracias

Author: Yoann Hercouet, 2013-06-17

3 answers

Parece que su aplicación está creando archivos, por lo que debe garantizar nombres de archivo únicos. Puedes mantener algún tipo de contador dentro de tu aplicación (guardado en preferencias o base de datos) y usarlo. Entonces podría crear nombres más cortos / más controlados, y controlar la singularidad usted mismo. O puedes usar createTempFile (), que te garantiza un nombre de archivo único (pero solo obtienes un control parcial del nombre de archivo). Parece que prefieres createTempFile(), así que no hay razón para no seguir usándola si están contentos con los nombres de archivo que genera. No hay otro lado negativo que no tener control total sobre el formato del nombre de archivo.

 18
Author: user1676075,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-17 15:01:49

Para los 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 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 del archivo para mantener los archivos únicos. También agregará una extensión de archivo que es .tmp de forma predeterminada, pero se puede establecer a cualquier cosa mediante el uso del segundo parámetro. El uso del número aleatorio significa a pesar de especificar un nombre de archivo no permanece igual que el número se añade junto con el sufijo/extensión de archivo (.tmp por defecto) por ejemplo, usted especifica su nombre de archivo como internal_file y 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 de archivo.getName (); pero tendría que 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 el 2a opción como el nombre de archivo que especifique es el nombre de archivo que se crea.

 17
Author: AdrenalineJunky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 12:30:23

1. Crear archivo con nombre aleatorio

File file = File.createTempFile(String prefix, String suffix, File parent)
  • En realidad crear el archivo en el disco y devuelve el archivo objeto
  • Cree un nombre de archivo en este formato: prefijo + número aleatorio + sufijo
  • Útil cuando necesita crear un archivo temporal en el disco

2. Crear archivo con el nombre exacto

File file = new File(File parent, String child);
file.createNewFile();
  • Realmente crear el archivo en el disco y devuelve true si el archivo se crea con éxito

  • El nombre del archivo será exactamente como pase al parámetro hijo

  • Útil cuando necesita crear un archivo permanente en el disco

3. Crear solo archivo objeto (en memoria)

File file = new File(File parent, String child);
// doesn't create the file on disk until calling createNewFile() method
  • Solo cree el en memoria y no realmente en disco
  • Útil cuando solo necesita crear un objeto de archivo (por ejemplo, solo para pasarlo como parámetro)

parent el parámetro puede ser uno de estos:

  1. Aplicación privada directorios

    • contexto.getCacheDir ()
    • contexto.getExternalCacheDir ()
    • y ... (la lista completa se puede encontrar aquí)
  2. Directorios públicos

    • Medio ambiente.getExternalStorageDirectory ()
    • Medio ambiente.getExternalStoragePublicDirectory( Ambiente.DIRECTORY_PICTURES)
    • y ... (la lista completa se puede encontrar aquí)
 13
Author: Behzad Bahmanyar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 16:54:20