File.createTempFile()VS new File()

Yoa*_*uet 47 android android-file

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

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

File imageFile = File.createTempFile(imageFileName, MyApplication.JPEG_FILE_SUFFIX, MyApplication.getAlbumDir());
Run Code Online (Sandbox Code Playgroud)

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

File imageFile = new File(MyApplication.getAlbumDir(), imageFileName + MyApplication.JPEG_FILE_SUFFIX);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

我查看了有关该功能的文档,但我没有找到任何关于使用它而不是使用它的可能后果new File.

谢谢

use*_*075 22

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

  • 所以 createTempFile() 实际上并不创建 *temp* 文件 (4认同)
  • 是的,这很安全。同样,唯一的缺点/是您没有完全控制文件名。 (2认同)

Adr*_*nky 21

对于临时内部文件,它们是2个选项

1.

File file; 
file = File.createTempFile(filename, null, this.getCacheDir());
Run Code Online (Sandbox Code Playgroud)

2.

File file
file = new File(this.getCacheDir(), filename);
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,在缓存中创建临时文件不适用于 [某些活动](http://stackoverflow.com/questions/18711525/camera-not-working-saving-when-using-cache-uri-as-mediastore-extra -输出) (2认同)

Beh*_*yar 20

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

File file = File.createTempFile(String prefix, String suffix, File parent)
Run Code Online (Sandbox Code Playgroud)
  • 实际上在磁盘上创建文件并返回文件对象
  • 使用以下格式创建文件名:prefix + random number + suffix
  • 需要在磁盘上创建临时文件时很有用

2.使用确切名称创建文件

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

  • 文件名将完全传递给子参数

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

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

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

parent 参数可以是以下之一:

  1. 应用私人目录

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

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