60

在我的应用程序中,我添加了添加和保存日常图片的可能性,由Fragment.

为了将图片保存在 SD 卡上,我目前使用的功能是File.createTempFile

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir());

我实际上也尝试了标准方式:

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX);

两者都有效,但在我的情况下,第一个比第二个更好,因为该函数createTempFile在文件名的末尾添加了一个长随机数,使其唯一。

举个例子,这是我用两种方法得到的:

使用createTempFileIMG_2013-06-18_-1961144729.jpg

使用新文件IMG_2013-06-18_.jpg

最后我的问题是,继续使用createTempFile保存我的图片是否安全,或者我必须使用标准方式并添加一些代码来生成唯一的文件名?它应该只用于临时文件吗?

我查看了有关该功能的文档,但没有发现任何关于使用它而不是new File.

谢谢

4

4 回答 4

35

1.创建随机名称的文件

File file = File.createTempFile(String prefix, String suffix, File parent)
  • 实际在磁盘上创建文件并返回文件对象
  • 以这种格式创建文件名:前缀+随机数+后缀
  • 当您需要在磁盘上创建临时文件时很有用

2.创建具有确切名称的文件

File file = new File(File parent, String child);
file.createNewFile();
  • 实际在磁盘上创建文件,如果文件创建成功则返回 true

  • 文件名将与传递给子参数一样

  • 当您需要在磁盘上创建永久文件时很有用

3.只创建文件对象(在内存中)

File file = new File(File parent, String child);
// doesn't create the file on disk until calling createNewFile() method
  • 仅在内存中创建而不是在磁盘上创建
  • 当您只需要创建文件对象时很有用(例如,只是将其作为参数传递)

parent参数可以是以下之一:

  1. 应用私有目录

    • context.getCacheDir()
    • context.getExternalCacheDir()
    • 和...(完整列表可以在这里找到)
  2. 公共目录

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
    • 和...(完整列表可以在这里找到)
于 2017-01-12T16:54:20.380 回答
33

听起来您的应用正在创建文件,因此您需要保证文件名的唯一性。您可以在您的应用程序中保留某种计数器(保存到首选项或数据库)并使用它。然后您可以创建更短/更受控制的名称,并自己控制唯一性。或者您可以使用 createTempFile(),这将保证您获得唯一的文件名(但您只能获得文件名的部分控制权)。听起来您更喜欢 createTempFile(),所以如果您对它生成的文件名感到满意,就没有理由不继续使用它。除了无法完全控制文件名格式之外,没有其他缺点。

于 2013-06-17T15:01:49.640 回答
26

对于临时内部文件,它们是 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(); 找到它生成的文件名;但是您需要将其存储在某个地方,以便您可以随时使用它,例如删除或读取文件。

于 2013-11-25T12:30:23.823 回答
-1

这个简单的 Kotlin 函数将让您读取资产文件

@Throws(IOException::class)
fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
    .also {
        if (!it.exists()) {
            it.outputStream().use { cache ->
                context.assets.open(fileName).use { inputStream ->
                    inputStream.copyTo(cache)
                }
            }
        }
    }
于 2021-07-27T12:33:52.220 回答