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.

Спасибо


person Yoann Hercouet    schedule 17.06.2013    source источник


Ответы (3)


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

person user1676075    schedule 17.06.2013
comment
Да, createTempFile дает мне результаты, которые я хочу, но на самом деле мой вопрос заключается в следующем: безопасно ли продолжать использовать эту функцию, хотя на самом деле она предназначена только для создания временных файлов. - person Yoann Hercouet; 17.06.2013
comment
Да, это безопасно. Опять же, единственным недостатком/отличием является то, что у вас нет полного контроля над именем файла. - person user1676075; 17.06.2013
comment
Таким образом, createTempFile() на самом деле не создает файлы temp. - person pete; 11.08.2020

<сильный>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 может быть одним из следующих:

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

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

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES)
    • и... (полный список можно найти здесь)
person Behzad Bahmanyar    schedule 12.01.2017
comment
Спасибо за 3 (файл как параметр). getExternalStoragePublicDirectory больше не рекомендуется. См. commonsware.com/blog/2019/04. /22/. - person CoolMind; 15.07.2019

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

1.

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

2.

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

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

person AdrenalineJunky    schedule 25.11.2013
comment
Обратите внимание, что создание временных файлов в кеше не будет работать для определенные действия - person Atul; 14.05.2016
comment
@Atul, хорошо, это работает (по крайней мере, сейчас), вам просто нужно использовать FileProvider. - person dragi; 08.12.2017