Создание временных файлов в Android

205

Какой лучший способ создать временный файл в Android?

Можно ли использовать File.createTempFile ? Документация очень расплывчата по этому поводу.

В частности, неясно, когда File.createTempFileудаляются временные файлы, созданные с помощью , если вообще когда-либо.

hpique
источник
Вы можете начать с этого потока в stackoverflow, где обсуждаются временные файлы.
Бенни Скогберг
Это обсуждение группы разработчиков Google для Android может представлять интерес: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Ответы:

287

Это то, что я обычно делаю:

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

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

sparkymat
источник
2
Я тоже так делаю. Я предполагаю, что createTempFile не создает реальные временные файлы, если он не использует каталог кеша, но это на самом деле не задокументировано.
hpique
могу ли я предположить, что файл будет оставаться в течение всего времени, пока приложение работает, даже если другие приложения также запускают и создают свои собственные временные файлы?
Android-разработчик
1
Каждое приложение использует свой собственный кэш: по умолчанию файлы, сохраненные во внутреннем хранилище, являются частными для вашего приложения, и другие приложения не могут получить к ним доступ (равно как и пользователь). Если вы хотите кэшировать некоторые данные, вы должны использовать getCacheDir (), чтобы открыть файл, в котором ваше приложение должно сохранять временные файлы кэша. Когда на устройстве недостаточно внутренней памяти, Android может удалить эти файлы кэша, чтобы освободить место. Тем не менее, вы не должны полагаться на систему, чтобы очистить эти файлы для вас. Источник
felixd
Могу ли я использовать общий доступ к файлу?
АКС
4
Вы можете вызвать outputFile.deleteOnExit (). Теоретически, система будет очищать его при выходе из приложения. Стандартный метод в классе File.
Дейв Хаббард
90

Лучшие практики для внутренних и внешних временных файлов:

Внутренний кеш

Если вы хотите кэшировать некоторые данные, а не хранить их постоянно, вам следует использовать getCacheDir()файл, который представляет внутренний каталог, в котором ваше приложение должно сохранять файлы временного кэша.

Когда на устройстве недостаточно внутренней памяти, Android может удалить эти файлы кэша, чтобы освободить место. Тем не менее, вы не должны полагаться на систему, чтобы очистить эти файлы для вас. Вы должны всегда поддерживать файлы кэша самостоятельно и не выходить за разумные пределы, например, 1 МБ. Когда пользователь удаляет ваше приложение, эти файлы удаляются.

Внешний кэш

Чтобы открыть файл, представляющий каталог внешнего хранилища, в котором вы должны сохранять файлы кэша, позвоните getExternalCacheDir(). Если пользователь удалит ваше приложение, эти файлы будут автоматически удалены.

Подобно тому ContextCompat.getExternalFilesDirs(), как упомянуто выше, вы также можете получить доступ к каталогу кэша на вторичном внешнем хранилище (если доступно), позвонив ContextCompat.getExternalCacheDirs().

Совет. Чтобы сохранить файловое пространство и сохранить производительность вашего приложения, важно тщательно управлять файлами кэша и удалять те, которые больше не нужны, на протяжении всего жизненного цикла приложения.

mibollma
источник
2
Это не дает адекватного ответа на вопрос, что делать с большими временными файлами. Какова лучшая практика здесь? Я подозреваю, что нет ничего, кроме простого управления обычным файлом.
Мерк
35

Для временных внутренних файлов их 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();, но вам нужно будет хранить его где-нибудь, чтобы вы могли использовать его в любое время, например, чтобы удалить или прочитать файл. Поэтому по этой причине я предпочитаю второй вариант, поскольку имя файла, которое вы указываете, является именем файла, который создается.

AdrenalineJunky
источник
2
Могу ли я предположить, что временные файлы будут удалены только тогда, когда процесс приложения не работает?
разработчик Android
2
@androiddeveloper No.
Гильерме Бернал
@GuilhermeBernal Откуда ты это знаешь? Вы видели, как его удаляли?
разработчик Android
1
@androiddeveloper Извините, что не сообщил подробности ранее. Пользователь может открыть приложение, затем перейти к настройкам, очистить его кэш, а затем вернуться к приложению, и все это без его уничтожения. Таким образом, приложение не может предположить, что файл кэша не будет удален, и ничто не мешает самому Android сделать это без взаимодействия с пользователем.
Гильерме Бернал
14

Вы можете использовать каталог кеша с помощью context.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());
Macarse
источник
10
File temp = File.createTempFile («префикс», «суффикс», context.getCacheDir ());
Патрик
Спасибо, я сделал это, но мой размер файла равен 0B, где проблема, есть идеи?
user7856586
1

Вы можете использовать File.deleteOnExit()метод

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

На него ссылаются здесь https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)

kotucz
источник
7
Это в значительной степени бесполезно на Android из-за странного аромата используемой JVM (обычно он почти никогда не завершается)
weaknespase
1
Пока нет проблем с производительностью, удаляйте, удаляйте или удаляйте данные немедленно, когда они вам больше не нужны.
Redwolf
0

Сделай это по-простому. Согласно документации https://developer.android.com/training/data-storage/files

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

и удалите его после использования

picFile.delete()
Шивам Давар
источник