Файл.createTempFile () VS новый файл()

в моем приложении я добавил возможность добавлять и сохранять картинки на каждый день, представлен Fragment.

чтобы сохранить изображение на SD-карте, я в настоящее время использую функцию File.createTempFile:

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

Я на самом деле также пытался со стандартным способом:

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

оба работают, но в моем случае первый лучше, чем второй, поскольку функция createTempFile добавляет длинное случайное число в конце имени файла, что делает его уникальный.

чтобы дать вам пример, вот что я получаю с обоими методами:

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

С новый файл: IMG_2013-06-18_.jpg

наконец, мой вопрос в том, безопасно ли продолжать использовать createTempFile чтобы сохранить мои фотографии или мне нужно использовать стандартный способ и добавить код для создания уникального имени файла? Должен ли он использоваться только для временных файлов?

Я просмотрел документацию о функция, но я ничего не нашел о возможных последствиях ее использования вместо new File.

спасибо

3 ответов


похоже, что ваше приложение создает файлы, поэтому вам нужно гарантировать уникальные имена файлов. Вы можете сохранить какой-то счетчик в своем приложении (сохраненный в настройках или БД) и использовать его. Затем вы можете создавать более короткие / контролируемые имена и самостоятельно контролировать уникальность. Или вы можете использовать createTempFile (), который гарантирует вам уникальное имя файла (но вы получаете только частичный контроль над именем файла). Похоже, вы предпочитаете createTempFile (), поэтому нет причин не использовать его, если вы довольны именами файлов, которые он генерирует. Нет никакой обратной стороны, кроме отсутствия полного контроля над форматом имени файла.


для временных внутренних файлов их 2 варианта

1.

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

2.

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

обе опции добавляют файлы в каталог кэша приложений и, таким образом, могут быть очищены, чтобы освободить место по мере необходимости, но опция 1 добавит случайное число в конце имени файла, чтобы сохранить файлы уникальными. Он также добавит расширение файла, которое есть .tmp по умолчанию, но его можно установить на что угодно с помощью 2-го параметра. Использование случайного числа означает, несмотря указание имени файла не остается таким же, как число добавляется вместе с расширением суффикса/файла (.tmp по умолчанию) e.g вы указываете свое имя файла как internal_file и выходите как internal_file1456345.ПТМ. Хотя вы можете указать расширение, вы не можете указать добавляемое число. Однако вы можете найти имя файла, который он генерирует через файл.getName (); но вам нужно будет сохранить его где-то, чтобы вы могли использовать его, когда захотите, например, удалить или прочитать файл. Поэтому для этой причине я предпочитаю 2-й вариант в качестве имени файла указывается имя файла, который создается.


1. Создать файл со случайным именем

File file = File.createTempFile(String prefix, String suffix, File parent)
  • фактически создать файл на диске и возвращает объект file
  • создайте имя файла в этом формате: префикс + случайное число + суффикс
  • полезно, когда вам нужно создать временный файл на диске

2. Создать файл с точным именем

File file = new File(File parent, String child);
file.createNewFile();
  • фактически создайте файл на диске и возвращает true, если файл будет создан успешно

  • имя файла будет точно так же, как передать дочерний параметр

  • полезно, когда вам нужно создать постоянный файл на диске

3. Создать только файловый объект (в памяти)

File file = new File(File parent, String child);
// doesn't create the file on disk until calling createNewFile() method
  • только создать в памяти и не на самом деле на диске
  • полезно, когда вам нужно просто создать объект файла (e.g просто передать его как параметр)

  1. App частные каталоги

    • контексте.getCacheDir()
    • контексте.getExternalCacheDir()
    • и ... (полный список можно найти здесь)
  2. общественные каталогах

    • окружающая среда.getExternalStorageDirectory()
    • окружающая среда.getExternalStoragePublicDirectory( Окружающая среда.DIRECTORY_PICTURES)
    • и ... (полный список можно найти здесь)