【问题标题】:File.createTempFile() VS new File()File.createTempFile() VS 新文件()
【发布时间】:2013-06-17 14:56:05
【问题描述】:

在我的应用程序中,我添加了添加和保存日常图片的可能性,由 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 的可能后果。

谢谢

【问题讨论】:

    标签: android android-file


    【解决方案1】:

    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()
      • 和...(完整列表可以在here找到)
    2. 公共目录

      • Environment.getExternalStorageDirectory()
      • Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES)
      • 和...(完整列表可以在here找到)

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,createTempFile 正在给我想要的结果,但我的问题实际上是:继续使用此功能是否安全,而实际上它似乎仅用于临时文件创建。跨度>
    • 是的,它是安全的。同样,唯一的缺点/区别是您无法完全控制文件名。
    • 所以 createTempFile() 实际上并没有创建 temp 文件
    【解决方案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(); 找到它生成的文件名;但是您需要将其存储在某个地方,以便您可以随时使用它,例如删除或读取文件。因此,出于这个原因,我更喜欢第二个选项,因为您指定的文件名就是创建的文件名。

    【讨论】:

    • 请注意,在缓存中创建临时文件不适用于certain activities
    • @Atul,它工作得很好(至少现在),你只需要使用 FileProvider。
    【解决方案4】:

    这个简单的 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)
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      相关资源
      最近更新 更多