Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何每次都创建一个新文件,这样就不会覆盖任何内容?_Java_Android_Algorithm_File - Fatal编程技术网

Java 我如何每次都创建一个新文件,这样就不会覆盖任何内容?

Java 我如何每次都创建一个新文件,这样就不会覆盖任何内容?,java,android,algorithm,file,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"

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

一个快速而肮脏的解决方案是将系统时间放在文件名中:

File file = new File(dir, "test_" + System.currentTimeMillis() +".gif");

只要该方法不是以完全相同的毫秒执行,就不会有重复的方法。

一个快速而肮脏的解决方案是将系统时间放入文件名中:

File file = new File(dir, "test_" + System.currentTimeMillis() +".gif");

只要该方法不是以完全相同的毫秒执行,就不会有重复的方法。

您可以使用
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
,而不是在另一个调用检查方法是否存在之前创建文件的
文件)。

您可以使用
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
,而不是在另一次调用检查该方法是否存在之前已经创建文件的
文件)。

在应用程序生命周期内的每一次,还是永远的每一次?如果是前者,你可以只保留一个计数器,但如果是后者,你需要一个时间戳或GUID或其他通用唯一标识符。在应用程序的生命周期中的每一次,还是永远的每一次?如果是前者,你可以保留一个计数器,但如果是后者,你需要一个时间戳、GUID或其他通用唯一标识符。哇,这真聪明。谢谢。
System.currentTimeMillis
用于唯一文件名并不是很聪明。我不止一次落入陷阱。哇,这太聪明了。谢谢。
System.currentTimeMillis
用于唯一文件名并不是很聪明。我不止一次落入陷阱。