Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android createTempFile()与新文件()的比较_Android_Android File - Fatal编程技术网

Android createTempFile()与新文件()的比较

Android createTempFile()与新文件()的比较,android,android-file,Android,Android File,在我的应用程序中,我添加了为每天添加和保存图片的功能,用片段表示 为了将图片保存在SD卡上,我目前使用函数File.createTempFile: File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir()); 实际上,我也尝试了标准方法: File imageFile = new File(MyApplication.getAlb

在我的应用程序中,我添加了为每天添加和保存图片的功能,用
片段表示

为了将图片保存在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
在文件名的末尾添加了一个长的随机数,使其唯一

举个例子,下面是我使用这两种方法得到的结果:

使用createTempFile
IMG_2013-06-18-1961144729.jpg

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

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

我查看了有关该函数的文档,但没有发现使用它而不是
新文件
可能产生的任何后果


谢谢

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

对于临时内部文件,它们有两个选项

一,

二,


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

1。使用随机名称创建文件

File file = File.createTempFile(String prefix, String suffix, File parent)
File file = new File(File parent, String child);
file.createNewFile();
  • 实际在磁盘上创建文件并返回文件对象
  • 以以下格式创建文件名:前缀+随机数+后缀
  • 需要在磁盘上创建临时文件时非常有用
2。创建具有确切名称的文件

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

  • 文件名将与传递给子参数的文件名完全相同

  • 在需要在磁盘上创建永久文件时非常有用
3。仅创建文件对象(内存中)

  • 仅在内存中创建,而不是在磁盘上创建
  • 当您只需要创建文件对象时非常有用(例如,只需将其作为参数传递)
父参数可以是以下参数之一:

  • 应用程序专用目录

    • context.getCacheDir()
    • context.getExternalCacheDir()
    • 而且。。。(可找到完整列表)
  • 公共目录

    • Environment.getExternalStorageDirectory()
    • Environment.getExternalStoragePublicDirectory( 环境。目录(图片)
    • 而且。。。(可找到完整列表)

  • 是的,
    createTempFile
    提供了我想要的结果,但我的问题是:继续使用此函数是否安全,而实际上它似乎只用于临时文件创建。是的,它是安全的。同样,唯一的缺点/区别是您无法完全控制文件名。因此createTempFile()实际上不会创建临时文件请注意,在缓存中创建临时文件对@Atul不起作用,它可以工作(至少现在),您只需要使用FileProvider。感谢3(文件作为参数)。getExternalStoragePublicDirectory现在已不推荐使用。看见
    File file = new File(File parent, String child);
    // doesn't create the file on disk until calling createNewFile() method