ChatGPT解决这个技术问题 Extra ChatGPT

在 Android 中创建临时文件

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

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

特别是,不清楚何时删除使用 File.createTempFile 创建的临时文件(如果有的话)。

您可以从讨论临时文件的 stackoverflow 中的 this thread 开始。
此 Android 开发者 Google 小组讨论可能会引起您的兴趣:groups.google.com/group/android-developers/browse_thread/thread/…

M
Martin Zeitler

这是我通常做的:

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

至于他们的删除,我也不完全确定。因为我在缓存的实现中使用了它,所以我手动删除了最旧的文件,直到缓存目录大小下降到我的预设值。


我也是这样做的。我的假设是 createTempFile 不会创建真正的临时文件,除非它使用缓存目录,但这并没有真正记录。
我可以假设只要应用程序正在运行,即使其他应用程序也运行并创建自己的临时文件,该文件也会保留?
每个应用程序都使用自己的缓存:默认情况下,保存到内部存储的文件对您的应用程序是私有的,其他应用程序无法访问它们(用户也不能)。如果你想缓存一些数据,你应该使用 getCacheDir() 打开一个文件,你的应用程序应该在其中保存临时缓存文件。当设备内部存储空间不足时,Android 可能会删除这些缓存文件以恢复空间。但是,您不应依赖系统为您清理这些文件。 Source
我可以使用共享意图来共享此文件吗?
您可以调用 outputFile.deleteOnExit() 。理论上,当您的应用退出时,系统会对其进行清理。 File 类中的标准方法。
A
Antonio

internalexternal 临时文件的最佳做法:

Internal Cache

如果您想缓存一些数据,而不是永久存储,您应该使用 getCacheDir() 打开一个 File,该 File 代表应用程序应保存临时缓存文件的内部目录。当设备内部存储空间不足时,Android 可能会删除这些缓存文件以恢复空间。但是,您不应依赖系统为您清理这些文件。您应该始终自己维护缓存文件并保持在合理的空间消耗限制范围内,例如 1MB。当用户卸载您的应用程序时,这些文件将被删除。

External Cache

要打开代表应保存缓存文件的外部存储目录的文件,请调用 getExternalCacheDir()。如果用户卸载您的应用程序,这些文件将被自动删除。与上面提到的 ContextCompat.getExternalFilesDirs() 类似,您还可以通过调用 ContextCompat.getExternalCacheDirs() 访问辅助外部存储(如果可用)上的缓存目录。提示:要保留文件空间并保持应用程序的性能,请务必仔细管理缓存文件并删除在应用程序生命周期中不再需要的文件。


这并不能充分回答如何处理大型临时文件的问题。这里的最佳做法是什么?我怀疑除了简单地管理一个普通文件之外没有一个。
r
ra1ned

对于临时内部文件,它们是 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(); 找到它生成的文件名,但您需要将其存储在某个地方,以便您可以随时使用它,例如删除或读取文件。因此,出于这个原因,我更喜欢第二个选项,因为您指定的文件名是创建的文件名。


我可以假设只有当应用程序的进程不存在时才会删除临时文件吗?
@androiddeveloper 没有。
@GuilhermeBernal 你怎么知道的?你看到它被删除了吗?
@androiddeveloper 很抱歉之前没有提供详细信息。用户可以打开应用程序,然后转到设置,清除其缓存,然后返回应用程序,所有这些都不会杀死它。因此,应用程序不能假设缓存文件不会被删除,并且没有任何东西可以阻止 android 本身在没有用户交互的情况下这样做。
T
TheRealChx101

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

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

文件 temp=File.createTempFile("prefix","suffix",context.getCacheDir());
谢谢,我做到了,但是我的文件大小等于0B,问题出在哪里,有什么想法吗?
k
kotucz

您可以使用 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)


由于使用了奇怪的 JVM,它在 Android 上几乎没用(它几乎永远不会正常终止)
只要没有性能问题,当您不再需要数据时,立即删除、释放或删除数据。
S
Shivam Dawar

做起来很简单。根据文档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()