在我的应用中,我添加了为日常添加和保存图片的可能性,由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
可能产生的后果。
谢谢
答案 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)
<强> 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
参数可以是其中之一:
答案 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);