File.createTempFile()VS new File()

时间:2013-06-17 14:56:06

标签: android android-file

在我的应用中,我添加了为日常添加和保存图片的可能性,由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在文件名的末尾添加一个长的随机数,使其唯一。

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

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

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

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

我查看了有关该功能的文档,但我没有发现使用它而不是new File可能产生的后果。

谢谢

4 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:18)

对于临时内部文件,它们是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()找到它生成的文件名;但你需要将它存储在某个地方,以便你可以随时使用它,例如删除或读取文件。因此,我更喜欢第二个选项,因为您指定的文件名是创建的文件名。

答案 2 :(得分:15)

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

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

<强> 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

答案 3 :(得分:0)

这个简单的 Kotlin 函数可以让你读取资产文件

const algos = [
  (type, flag2, flag5) => type & (flag2 & flag5),
  (type, flag2, flag5) => type & (flag2 | flag5),
  (type, flag2, flag5) => type & (~flag2 & ~flag5)
  // etc
];

const data = {
 "refund": {
   "preFilters": {
     "type": [ "1" ]
   },
   "postFilters": {
     "flag2": [ "123", "678" ],
     "flag5": [ "907", "8752" ]
   }
 }
};

let output = [];
data.refund.preFilters.type.forEach(t => {
  data.refund.postFilters.flag2.forEach(f2 => {
    data.refund.postFilters.flag5.forEach(f5 => {
      output.push({
        type: t, 
        flag2: f2, 
        flag5: f5, 
        results: algos.map(algo => algo(t, f2, f5))
      });
    });
  });
});
console.log(output);