【问题标题】:Creating temporary files in Android在 Android 中创建临时文件
【发布时间】:2011-03-26 10:48:48
【问题描述】:

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

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

具体而言,不清楚何时删除使用File.createTempFile 创建的临时文件(如果有的话)。

【问题讨论】:

标签: android file-io temporary-files


【解决方案1】:

这是我通常做的:

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

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

【讨论】:

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

internal 和 external 临时文件的最佳做法:

Internal Cache

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

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

External Cache

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

类似于上面提到的ContextCompat.getExternalFilesDirs(), 您还可以访问辅助外部存储上的缓存目录 (如果有的话)致电ContextCompat.getExternalCacheDirs()。

提示:为了节省文件空间并保持应用的性能,它是 重要的是您仔细管理缓存文件并删除那些 在您的应用的整个生命周期中不再需要这些内容。

【讨论】:

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

对于临时内部文件,它们有 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 本身在没有用户交互的情况下这样做。
【解决方案4】:

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

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

【讨论】:

  • 文件 temp=File.createTempFile("prefix","suffix",context.getCacheDir());
  • 谢谢,我做到了,但是我的文件大小等于0B,问题出在哪里,有什么想法吗?
【解决方案5】:

【讨论】:

  • 由于使用了奇怪的 JVM,它在 Android 上几乎没用(它几乎永远不会正常终止)
  • 只要没有性能问题,当您不再需要数据时,立即删除、释放或丢弃数据。
【解决方案6】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多