我这里有这个代码,可以将图像的位图保存为名为test的GIF文件,但每次用户将其保存为test.gif,以便不断覆盖。
有哪些方法可以避免过度使用并每次以编程方式生成新文件名?
if(imagesPathList !=null){
if(imagesPathList.size()>1) {
Toast.makeText(MainActivity.this, imagesPathList.size() + " no of images are selected", Toast.LENGTH_SHORT).show();
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "test.gif");
try{
FileOutputStream f = new FileOutputStream(file);
f.write(generateGIF(list));
} catch(Exception e) {
e.printStackTrace();
}
答案 0 :(得分:2)
快速而肮脏的解决方案是将系统时间放在文件名中:
File file = new File(dir, "test_" + System.currentTimeMillis() +".gif");
只要该方法不是以完全相同的毫秒执行,就不会有重复。
答案 1 :(得分:1)
您可以使用java.io.File.createTempFile("test", ".gif", dir)
这会创建唯一的文件名,但一段时间后它们可能会显着变长。
或者,您可以创建一个自己创建唯一文件名的方法:
private File createNewDestFile(File path, String prefix, String suffix) {
File ret = new File(path, prefix + suffix);
int counter = 0;
while (ret.exists()) {
counter++;
ret = new File(path, prefix + "_" + counter + suffix);
}
return ret;
}
而不是
File file = new File(dir, "test.gif");
你打电话
File file = createNewDestFile(dir, "test", ".gif");
这不是线程安全的。为此,您需要一个更复杂的方法(例如,同步它并创建一个FileOutputStream
而不是File
,它正在创建该文件之前,该方法的另一个调用检查检查它的存在。)