Membuat file sementara di Android


204

Apa cara terbaik untuk membuat file sementara di Android?

Bisakah File.createTempFile digunakan? Dokumentasinya sangat kabur tentang itu.

Secara khusus, tidak jelas kapan file sementara yang dibuat dengan File.createTempFiledihapus, jika pernah.


Anda bisa mulai dengan utas ini di stackoverflow, tempat file temp dibahas.
Benny Skogberg

Diskusi grup Google Developers Android Developers ini mungkin menarik: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Jawaban:


286

Inilah yang biasanya saya lakukan:

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

Adapun penghapusan mereka, saya juga tidak yakin. Karena saya menggunakan ini dalam implementasi cache, saya secara manual menghapus file tertua sampai ukuran direktori cache turun ke nilai preset saya.


2
Itu yang saya lakukan juga. Asumsi saya adalah bahwa createTempFile tidak membuat file sementara nyata kecuali ia menggunakan dir cache, tetapi ini tidak benar-benar didokumentasikan.
hpique

dapatkah saya menganggap file tersebut akan tetap selama aplikasi berjalan, bahkan jika aplikasi lain juga menjalankan dan membuat file sementara mereka sendiri?
pengembang android

1
Setiap aplikasi menggunakan cache sendiri: Secara default, file yang disimpan ke penyimpanan internal bersifat pribadi untuk aplikasi Anda dan aplikasi lain tidak dapat mengaksesnya (juga tidak dapat pengguna). Jika Anda ingin men-cache beberapa data, Anda harus menggunakan getCacheDir () untuk membuka File di mana aplikasi Anda harus menyimpan file cache sementara. Ketika perangkat kekurangan ruang penyimpanan internal, Android dapat menghapus file cache ini untuk memulihkan ruang. Namun, Anda tidak harus bergantung pada sistem untuk membersihkan file-file ini untuk Anda. Sumber
felixd

Bisakah saya menggunakan niat berbagi untuk berbagi file ini?
aks

4
Anda dapat memanggil outputFile.deleteOnExit (). Secara teori, sistem akan membersihkannya saat aplikasi Anda keluar. Metode standar dalam kelas File.
Dave Hubbard

90

Praktik terbaik pada file sementara internal dan eksternal :

Cache internal

Jika Anda ingin men-cache beberapa data, daripada menyimpannya secara terus-menerus, Anda harus menggunakannya getCacheDir()untuk membuka File yang mewakili direktori internal tempat aplikasi Anda harus menyimpan file cache sementara.

Ketika perangkat kekurangan ruang penyimpanan internal, Android dapat menghapus file cache ini untuk memulihkan ruang. Namun, Anda tidak harus bergantung pada sistem untuk membersihkan file-file ini untuk Anda. Anda harus selalu menjaga file cache sendiri dan tetap dalam batas ruang yang dikonsumsi, seperti 1MB. Saat pengguna mencopot pemasangan aplikasi Anda, file-file ini dihapus.

Cache Eksternal

Untuk membuka File yang mewakili direktori penyimpanan eksternal tempat Anda menyimpan file cache, panggil getExternalCacheDir() . Jika pengguna mencopot pemasangan aplikasi Anda, file-file ini akan dihapus secara otomatis.

Mirip dengan ContextCompat.getExternalFilesDirs(), yang disebutkan di atas, Anda juga dapat mengakses direktori cache pada penyimpanan eksternal sekunder (jika tersedia) dengan meneleponContextCompat.getExternalCacheDirs() .

Kiat: Untuk menjaga ruang file dan mempertahankan kinerja aplikasi Anda, penting bagi Anda untuk mengelola file cache dengan hati-hati dan menghapus yang tidak diperlukan lagi sepanjang siklus hidup aplikasi Anda.


2
Ini tidak cukup menjawab pertanyaan tentang apa yang harus dilakukan dengan file sementara besar. Apa praktik terbaik di sini? Saya menduga tidak ada satu, selain hanya mengelola file normal.
Merk

35

Untuk file internal sementara, ada 2 opsi

1.

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

2.

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

Kedua opsi menambahkan file dalam direktori cache aplikasi dan dengan demikian dapat dihapus untuk membuat ruang seperti yang diperlukan tetapi opsi 1 akan menambahkan nomor acak di akhir nama file untuk menjaga file unik. Itu juga akan menambahkan ekstensi file yang secara .tmpdefault, tetapi dapat diatur untuk apa pun melalui penggunaan parameter ke-2. Penggunaan bilangan acak berarti meskipun menentukan nama file itu tidak tetap sama dengan nomor ditambahkan bersama dengan akhiran / ekstensi file ( .tmpsecara default) misalnya Anda menentukan nama file Anda internal_filedan keluar sebagai internal_file1456345.tmp. Sedangkan Anda dapat menentukan ekstensi, Anda tidak dapat menentukan nomor yang ditambahkan. Namun Anda dapat menemukan nama file yang dihasilkannyafile.getName();, tetapi Anda harus menyimpannya di suatu tempat sehingga Anda dapat menggunakannya kapan pun Anda ingin misalnya menghapus atau membaca file. Karenanya untuk alasan ini saya lebih suka opsi ke-2 karena nama file yang Anda tentukan adalah nama file yang dibuat.


2
Dapatkah saya berasumsi bahwa file sementara hanya akan dihapus ketika proses aplikasi tidak hidup?
pengembang android

2
@androiddeveloper No.
Guilherme Bernal

@GuilhermeBernal Bagaimana Anda tahu itu? Pernahkah Anda melihatnya dihapus?
pengembang android

1
@androiddeveloper Maaf karena tidak memberikan detail sebelumnya. Seorang pengguna dapat membuka aplikasi, lalu pergi ke pengaturan, menghapus cache-nya dan kemudian kembali ke aplikasi, semuanya tanpa terbunuh. Jadi aplikasi tidak dapat menganggap file cache tidak akan dihapus dan tidak ada yang menghentikan android itu sendiri tanpa interaksi pengguna.
Guilherme Bernal

14

Anda dapat menggunakan direktori cache menggunakan context.getCacheDir () .

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

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

Terima kasih, saya berhasil, tetapi ukuran file saya sama dengan 0B, di mana masalahnya, ada ide?
user7856586

1

Anda dapat menggunakan File.deleteOnExit()metode ini

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

Ini dirujuk di sini https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)


7
Hal ini cukup banyak berguna pada Android karena rasa aneh JVM digunakan (Ini hampir tidak pernah menghentikan biasanya)
weaknespase

1
Selama tidak ada masalah kinerja, hapus, lepas, atau lepas data dengan segera, saat Anda tidak membutuhkannya lagi.
Redwolf

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.