Java 我如何每次都创建一个新文件,这样就不会覆盖任何内容?
我这里有一段代码,它将图像的位图保存为一个名为test的GIF文件,但每次用户都将其保存为test.GIF,因此它会不断被覆盖 有哪些方法可以避免过度扩展并每次以编程方式生成新文件名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"
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
用于唯一文件名并不是很聪明。我不止一次落入陷阱。