如何每次都创建一个新文件,以免被覆盖?

时间:2017-11-06 20:00:42

标签: java android algorithm file

我这里有这个代码,可以将图像的位图保存为名为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();
        }

2 个答案:

答案 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,它正在创建该文件之前,该方法的另一个调用检查检查它的存在。)