在Android中创建临时文件


204

在Android中创建临时文件的最佳方法是什么?

可以使用File.createTempFile吗?该文档对此非常含糊。

特别是,尚不清楚何时使用创建的临时文件File.createTempFile被删除。


您可以从stackoverflow中的此线程开始,其中讨论了临时文件。
Benny Skogberg,2010年

这个Android开发者谷歌小组讨论可能会感兴趣:groups.google.com/group/android-developers/browse_thread/thread/...
hpique

Answers:


286

这通常是我要做的:

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

至于它们的删除,我也不完全确定。由于在缓存实现中使用了此功能,因此我手动删除了最早的文件,直到缓存目录大小减小到预设值为止。


2
那也是我所做的。我的假设是,除非createTempFile使用高速缓存目录,否则它不会创建真正的临时文件,但这并未真正记录。
hpique 2011年

我可以假设即使其他应用程序也正在运行并创建自己的临时文件,只要该应用程序在运行,该文件仍将保留?
Android开发者

1
每个应用程序都使用其自己的缓存:默认情况下,保存到内部存储中的文件是应用程序专用的,其他应用程序无法访问它们(用户也不能访问它们)。如果要缓存某些数据,则应使用getCacheDir()打开一个文件,应用程序应在该文件中保存临时缓存文件。当设备的内部存储空间不足时,Android可能会删除这些缓存文件以恢复空间。但是,您不应依赖系统来为您清理这些文件。 消息来源
2013年

我可以使用共享意图共享此文件吗?
aks

4
您可以调用outputFile.deleteOnExit()。从理论上讲,系统将在您的应用退出时对其进行清理。File类中的标准方法。
戴夫·哈伯德

90

内部外部临时文件的最佳做法:

内部缓存

如果您想缓存某些数据,而不是永久存储它们,则应使用getCacheDir()打开一个文件,该文件表示应用程序应在其中保存临时缓存文件的内部目录。

当设备的内部存储空间不足时,Android可能会删除这些缓存文件以恢复空间。但是,您不应依赖系统来为您清理这些文件。您应该始终自己维护高速缓存文件,并保持在合理的空间消耗限制内,例如1MB。当用户卸载您的应用程序时,这些文件将被删除。

外部缓存

要打开一个代表您应该在其中保存缓存文件的外部存储目录的文件,请调用getExternalCacheDir()。如果用户卸载您的应用程序,这些文件将被自动删除。

ContextCompat.getExternalFilesDirs()上述类似,您还可以通过调用来访问辅助外部存储(如果可用)上的缓存目录ContextCompat.getExternalCacheDirs()

提示:要保留文件空间并保持应用程序的性能,请务必认真管理缓存文件并删除整个应用程序生命周期中不再需要的文件,这一点很重要。


2
这不能充分回答如何处理大型临时文件的问题。最佳做法是什么?我怀疑没有,除了简单地管理普通文件。
Merk 2015年

35

对于临时内部文件,它们是2个选项

1。

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

2。

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

这两个选项都将文件添加到应用程序缓存目录中,因此可以清除以根据需要腾出空间,但是选项1将在文件名的末尾添加一个随机数以保持文件唯一。它还将添加一个.tmp默认情况下的文件扩展名,但是可以使用2nd参数将其设置为任何文件。使用随机数意味着,尽管指定了文件名,但它不会与添加数字以及后缀/文件扩展名(.tmp默认情况下)相同,例如,您将文件名指定为internal_file,结果为internal_file1456345.tmp。您可以指定扩展名,而不能指定添加的号码。但是,您可以找到它通过生成的文件名file.getName();,但您需要将其存储在某个位置,以便可以在任何时候使用它,例如,删除或读取文件。因此,由于这个原因,我更喜欢第二个选项,因为您指定的文件名是创建的文件名。


2
我可以假定仅在应用程序的进程不活动时才删除临时文件吗?
Android开发人员

2
@androiddeveloper号
Guilherme Bernal,

@GuilhermeBernal你怎么知道的?您看到它被删除了吗?
Android开发人员

1
@androiddeveloper对不起,您之前没有提供详细信息。用户可以打开该应用程序,然后转到设置,清除其缓存,然后返回该应用程序,而这一切都不会终止。因此,应用程序不能假设不会删除缓存文件,并且在没有用户交互的情况下,Android本身不会停止这样做。
Guilherme Bernal

14

您可以使用context.getCacheDir()使用缓存目录。

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

10
文件temp = File.createTempFile(“ prefix”,“ suffix”,context.getCacheDir());
Patrick

谢谢,我做到了,但是我的文件大小等于0B,问题出在哪里,有什么主意吗?
user7856586

0

7
由于使用了奇怪的JVM风格,它在Android上几乎没有用(几乎永远不会正常终止)
弱点

1
只要不存在性能问题,在不再需要时立即删除,释放或删除数据。
Redwolf

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.