Подтвердить что ты не робот

File.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.

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

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

1.

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

2.

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

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

Ответ 3

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

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

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
  • Создавать только в памяти, а не на диске
  • Полезно, когда вам нужно просто создать файл-объект (например, просто передать его как параметр)
Параметр

parent может быть одним из следующих:

  • Частные каталоги приложений

    • context.getCacheDir()
    • context.getExternalCacheDir()
    • и... (полный список можно найти здесь)
  • Публичные каталоги

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory(   Environment.DIRECTORY_PICTURES)
    • и... (полный список можно найти здесь)