Android'de geçici dosyalar oluşturma


206

Android'de geçici bir dosya oluşturmanın en iyi yolu nedir?

Can File.createTempFile kullanılacak? Belgeler bu konuda çok belirsiz.

Özellikle, ile oluşturulan geçici dosyaların, ne zaman File.createTempFilesilindiği açık değildir .


Bu iş parçacığı ile geçici dosyaların tartışıldığı stackoverflow'da başlayabilirsiniz .
Benny Skogberg

Bu Android Geliştiricileri Google grubu tartışması ilgi çekici olabilir: groups.google.com/group/android-developers/browse_thread/thread/…
hpique

Yanıtlar:


287

Ben tipik olarak budur:

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

Onların silinmesine gelince, ben de tam değilim. Bunu bir önbellek uygulamamda kullandığımdan, önbellek dizini boyutu önceden ayarlanmış değerime gelene kadar en eski dosyaları el ile silerim.


2
Ben de öyle yapıyorum. Benim varsayımım, createTempFile'ın önbellek dizinini kullanmadığı sürece gerçek geçici dosyalar yaratmadığı, ancak bu gerçekten belgelenmediğidir.
hpique

diğer uygulamalar da kendi geçici dosyalarını çalıştırıp oluştursa bile, dosyanın uygulama çalıştığı sürece kalacağını varsayabilir miyim?
android geliştirici

1
Her uygulama kendi önbelleğini kullanır: Varsayılan olarak, dahili depolama birimine kaydedilen dosyalar uygulamanıza özeldir ve diğer uygulamalar bu dosyalara erişemez (kullanıcı da erişemez). Bazı verileri önbelleğe almak istiyorsanız, uygulamanızın geçici önbellek dosyalarını kaydetmesi gereken bir Dosya açmak için getCacheDir () yöntemini kullanmanız gerekir. Cihazın dahili depolama alanı azaldığında, Android alan kazanmak için bu önbellek dosyalarını silebilir. Ancak, bu dosyaları sizin için temizlemek için sisteme güvenmemelisiniz. Kaynak
felixd

Bu dosyayı paylaşmak için paylaşım amacını kullanabilir miyim?
aks

4
OutputFile.deleteOnExit () öğesini çağırabilirsiniz. Teorik olarak, uygulamanızdan çıkıldığında sistem onu ​​temizler. Dosya sınıfında standart yöntem.
Dave Hubbard

90

Dahili ve harici geçici dosyalar için en iyi uygulamalar :

Dahili Önbellek

Bazı verileri kalıcı olarak saklamak yerine önbelleğe almak isterseniz getCacheDir(), uygulamanızın geçici önbellek dosyalarını kaydetmesi gereken dahili dizini temsil eden bir Dosya açmak için kullanmalısınız .

Cihazın dahili depolama alanı azaldığında, Android alan kazanmak için bu önbellek dosyalarını silebilir. Ancak, bu dosyaları sizin için temizlemek için sisteme güvenmemelisiniz. Önbellek dosyalarını her zaman kendiniz tutmalı ve 1MB gibi tüketilen makul bir alan dahilinde kalmalısınız. Kullanıcı uygulamanızı kaldırdığında, bu dosyalar kaldırılır.

Harici Önbellek

Önbellek dosyalarını kaydetmeniz gereken harici depolama dizinini temsil eden bir Dosya açmak için arayın getExternalCacheDir(). Kullanıcı uygulamanızı kaldırırsa, bu dosyalar otomatik olarak silinir.

Benzer ContextCompat.getExternalFilesDirs()Yukarıda bahsedildiği, ayrıca arayarak (varsa) ikincil harici depolama önbellek dizinine erişebilirsiniz ContextCompat.getExternalCacheDirs().

İpucu: Dosya alanını korumak ve uygulamanızın performansını korumak için, önbellek dosyalarınızı dikkatli bir şekilde yönetmeniz ve uygulamanızın yaşam döngüsü boyunca artık gerekmeyen dosyaları kaldırmanız önemlidir.


2
Bu, büyük geçici dosyalarla ne yapılacağı sorusuna yeterince cevap vermez. Buradaki en iyi uygulama nedir? Normal bir dosyayı yönetmekten başka bir tane olmadığından şüpheleniyorum.
Merk

35

Geçici dahili dosyalar için bunların 2 seçeneği vardır

1.

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

2.

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

Her iki seçenek de uygulamalar önbellek dizinine dosya ekler ve bu nedenle gerektiğinde yer açmak için temizlenebilir, ancak 1. seçenek dosyaları benzersiz tutmak için dosya adının sonuna rastgele bir sayı ekler. Ayrıca .tmpvarsayılan olarak bir dosya uzantısı ekler , ancak 2. parametrenin kullanılmasıyla herhangi bir şeye ayarlanabilir. Rastgele sayının kullanılması, bir dosya adı belirtilmesine rağmen, sonek / dosya uzantısıyla birlikte .tmpvarsayılan olarak eklenen numarayla aynı kalmayacağı anlamına gelir ( varsayılan olarak), örneğin dosya adınızı olarak belirtir internal_fileve olarak çıkar internal_file1456345.tmp. Bununla birlikte, uzantıyı belirtebilirsiniz, eklenen numarayı belirtemezsiniz. Ancak oluşturduğu dosya adını bulabilirsiniz.file.getName();, ancak bir yerde saklamanız gerekir; böylece dosyayı silmek veya okumak istediğinizde kullanabilirsiniz. Bu nedenle, belirttiğiniz dosya adı oluşturulan dosya adı olduğundan 2. seçeneği tercih ederim.


2
Geçici dosyaların yalnızca uygulamanın işlemi canlı olmadığında silineceğini varsayabilir miyim?
android geliştirici

2
@androiddeveloper No.
Guilherme Bernal

@GuilhermeBernal Bunu nasıl biliyorsun? Silindiğini gördün mü?
android geliştirici

1
@androiddeveloper Daha önce ayrıntı vermediğim için üzgünüm. Bir kullanıcı uygulamayı açabilir, ardından ayarlara gidebilir, önbelleğini temizleyebilir ve daha sonra, uygulamayı öldürmeden uygulamaya geri dönebilir. Dolayısıyla bir uygulama önbellek dosyasının silinmeyeceğini varsayamaz ve hiçbir şey kullanıcı etkileşimi olmadan android'in kendisini durduramaz.
Guilherme Bernal

14

Context.getCacheDir () öğesini kullanarak önbellek dizinini kullanabilirsiniz .

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

10
Dosya temp = File.createTempFile ("önek", "sonek", context.getCacheDir ());
Patrick

Teşekkürler, yaptım, ancak dosya boyutum 0B'ye eşit, sorunun nerede olduğu, herhangi bir fikir?
user7856586


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.