android 创建临时文件()与新建文件()

0s7z1bwu  于 2022-11-20  发布在  Android
关注(0)|答案(4)|浏览(208)

为了在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在文件名的末尾添加了一个长随机数,使其唯一。
给予个例子,下面是我用这两种方法得到的结果:
使用创建临时文件IMG_2013-06-18_-1961144729.jpg
使用新文件IMG_2013-06-18_.jpg
最后,我的问题是,继续使用createTempFile保存图片安全吗?还是必须使用标准方法并添加一些代码来生成唯一的文件名?它是否应该只用于临时文件?
我查看了关于该函数的文档,但没有发现任何关于使用它而不是new File的可能后果的信息。

kg7wmglp

kg7wmglp1#

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参数可以是下列之一:
  • 应用程序专用目录
  • ()调用一个缓存目录
  • ()调用一个新的缓存目录
  • 和...(完整列表可在here中找到)
  • 公用目录
  • 环境.getExternalStorageDirectory()函数调用
  • 环境.getExternalStoragePublicDirectory(环境.目录图片)
  • 和...(完整列表可在here中找到)
icnyk63a

icnyk63a2#

听起来你的应用程序正在创建文件,所以你需要保证文件名的唯一性。(保存到首选项或DB)并使用它。然后您可以创建更短/更可控的名称,并自己控制唯一性。或者您可以使用createTempFile(),这将保证您获得唯一的文件名(但是您只能部分控制文件名)。(),所以如果你对它生成的文件名感到满意,没有理由不继续使用它。除了不能完全控制文件名格式之外,没有什么不好的地方。

yqlxgs2m

yqlxgs2m3#

对于临时内部文件,有两个选项
1.

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

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

0h4hbjxa

0h4hbjxa4#

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

相关问题