Створення тимчасових файлів в Android


204

Який найкращий спосіб створити тимчасовий файл в Android?

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

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


Ви можете почати з цього потоку в stackoverflow, де обговорюються тимчасові файли.
Бенні Скогберг

Це обговорення групи для розробників Android для Android може зацікавити: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Відповіді:


286

Це те, що я зазвичай роблю:

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

Щодо їх вилучення, я теж не повністю впевнений. Оскільки я використовую це у своїй реалізації кешу, я вручну видаляю найдавніші файли, поки розмір каталогу кеша не зменшиться до мого попередньо встановленого значення.


2
Це я і роблю. Моє припущення, що createTempFile не створює реальних тимчасових файлів, якщо він не використовує кеш-dir, але це не дуже задокументовано.
hpique

чи можу я припустити, що файл залишатиметься доки програма працює, навіть якщо інші програми також запускаються та створюють власні тимчасові файли?
андроїд розробник

1
Кожен додаток використовує власний кеш: За замовчуванням файли, збережені у внутрішній пам’яті, є приватними для вашої програми, а інші програми не можуть отримати до них доступ (як і користувач). Якщо ви хочете кешувати деякі дані, скористайтеся getCacheDir (), щоб відкрити файл, де ваша програма повинна зберігати тимчасові файли кешу. Якщо у пристрою мало місця на внутрішньому сховищі, Android може видалити ці файли кешу, щоб відновити простір. Однак вам не слід покладатися на систему очищення цих файлів для вас. Джерело
felixd

Чи можу я використовувати спільний намір поділитися цим файлом?
акс

4
Ви можете зателефонувати outputFile.deleteOnExit (). Теоретично система очистить його, коли ваш додаток закриється. Стандартний метод у класі файлів.
Дейв Хаббард

90

Кращі практики щодо внутрішніх та зовнішніх тимчасових файлів:

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

Якщо ви хочете кешувати деякі дані, а не постійно зберігати їх, вам слід скористатися, getCacheDir()щоб відкрити файл, який представляє внутрішній каталог, де ваша програма повинна зберігати тимчасові файли кешу.

Якщо у пристрою мало місця на внутрішньому сховищі, Android може видалити ці файли кешу, щоб відновити простір. Однак вам не слід покладатися на систему очищення цих файлів для вас. Ви завжди повинні підтримувати файли кешу самостійно і залишатися в межах розумного обсягу споживаного місця, наприклад, 1 Мб. Коли користувач видаляє вашу програму, ці файли видаляються.

Зовнішній кеш

Щоб відкрити файл, який представляє зовнішній каталог зберігання, куди слід зберігати файли кешу, зателефонуйте getExternalCacheDir(). Якщо користувач видалить вашу програму, ці файли будуть автоматично видалені.

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

Порада. Щоб зберегти файловий простір і підтримати продуктивність програми, важливо ретельно керувати файлами кешу та видаляти ті, які більше не потрібні протягом життєвого циклу програми.


2
Це не відповідає належним чином на питання, що робити з великими тимчасовими файлами. Яка тут найкраща практика? Я підозрюю, що немає іншого, крім простого управління звичайним файлом.
Мерк

35

Для тимчасових внутрішніх файлів їх є 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();, але вам потрібно буде зберігати його десь, щоб ви могли використовувати його, коли хотіли, наприклад, для видалення чи читання файлу. Тому з цієї причини я віддаю перевагу другому варіанту, оскільки ім'я файлу, яке ви вказуєте, - це ім'я файлу, яке створюється.


2
Чи можу я припустити, що тимчасові файли будуть видалені лише тоді, коли процес програми не активований?
андроїд розробник

2
@androiddeveloper No.
Guilherme Bernal

@GuilhermeBernal Як ти це знаєш? Ви бачили, як його видаляють?
андроїд розробник

1
@androiddeveloper Вибачте за те, що раніше не наводив деталей. Користувач може відкрити додаток, потім перейти до налаштувань, очистити кеш-пам'ять, а потім повернутися до програми, і все це не буде вбито. Таким чином, програма не може припустити, що кеш-файл не буде видалений, і ніщо не зупиняє Android, не роблячи це без взаємодії з користувачем.
Гільгерме Бернал

14

Ви можете використовувати кеш-dir за допомогою контексту.getCacheDir () .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());

10
Файл temp = File.createTempFile ("префікс", "суфікс", context.getCacheDir ());
Патрік

Дякую, я це зробив, але розмір мого файлу дорівнює 0В, де проблема, якісь ідеї?
користувач7856586

0

Можна використовувати 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)


7
На Android це майже марно через дивний смак використовуваного JVM (майже ніколи не закінчується нормально)
слабенька папка

1
Поки не виникає проблем щодо ефективності, видаляйте, видаляйте або видаляйте дані негайно, коли вони вам більше не потрібні.
Redwolf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.