我使用SWT在Java中編寫應用程序。我想創建獨特的文件名。但我不想在硬盤上創建它。附加功能:我想在指定的文件夾中創建唯一的文件名。如何使用創建文件創建tmp文件名
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
我使用SWT在Java中編寫應用程序。我想創建獨特的文件名。但我不想在硬盤上創建它。附加功能:我想在指定的文件夾中創建唯一的文件名。如何使用創建文件創建tmp文件名
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
在文件名中使用時間戳嗎?
當然,如果您具有非常高的併發性,這可能無法正常工作。
例如:
public String getUniqueFileName(String directory, String extension) {
return new File(directory, new StringBuilder().append("prefix")
.append(date.getTime()).append(UUID.randomUUID())
.append(".").append(extension).toString()).getAbsolutePath();
}
約翰·奧克斯利法案的回答暗示。 UUID可能是一個解決方案,因爲您可以使用4種不同的方案來創建它們。儘管碰撞的可能性很小。如果您將時間戳與隨機UUID組合在一起,則任何碰撞的機會都變得非常小。
你可以嘗試使用GUID爲文件名。
您可以使用任何名稱(時間,GUID等)創建一個文件,然後測試它是否已經存在。如果確實如此,請嘗試使用其他名稱以查看它是否是唯一的。
File f = new File(guid);
if (f.exists()) {
//try another guid
}else{
//you're good to go
}
@Nick:在'f.exists()'和'//你很好去'之間'一個具有該名字的文件可以出現在文件系統上。 – 2009-08-18 16:17:23
從你的問題我想你已經看到了File.createTempFile()
通常會創建一個文件,而不是隻讓你生成的名字。
但是,爲什麼不只是調用方法,然後刪除創建的臨時文件? createTempFile()
完成了在指定目錄中查找唯一文件名的所有工作,並且自創建該文件以來,您也一定會將其刪除。
File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
@Dave:在'f.delete()'之後,文件名不再保證是唯一的。在刪除由'createTempFile()創建的文件後,在文件系統上會出現另一個具有相同名稱的文件。 – 2009-08-18 16:18:31
@Grant Wagner:的確如此。這就是爲什麼操作需要原子化。如果你只是想產生一個隨機的名字,而不僅僅是用一些隨機數連接時間戳 – polvoazul 2016-08-18 19:28:45
@polvoazul:不幸的是,沒有辦法做@michał-ziober所要求的並且保證文件名在該目錄中仍然沒有被使用。不帶GUID/UUID,不帶時間戳和隨機數。這是不可能的。 @ dave-webb的答案是最接近你的標準(通過調用內置的'File.createTempFile')。刪除文件只是爲了滿足原始問題的限制。 – onlynone 2016-12-13 15:26:08
簡化其他的答案,使用GUID。恕我直言,不需要添加鹽至UUID
。這是我使用的是什麼:
public static String getUniqueFileName(String directory, String extension) {
String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim());
return Paths.get(directory, fileName).toString();
}
用法:
String uniqueFileName = getUniqueFileName("/tmp", "pdf");
System.out.println(uniqueFileName);
輸出
/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf
您可以創建一個實際的唯一目錄(子目錄),然後其中的任何文件 應該是唯一的,例如「myFile」。「+分機
public static String getUniqueFileName(String directory, String extension) {
try
{
// create actual unique subdirectory in the given directory
//
File myUniqueDir = File.createTempFile("udir", null,directory);
String filename = myUniqueDir.getName();
myUniqueDir.delete(); // don't want the file but a directory
myUniqueDir.mkdirs();
}
//todo: catch ....
// for example:
return directory + "/" + myUniqueDir + "/myFile." + extension;
}
這個過程應該在正常的情況下工作,即使併發。除非我們開始在想佔領我們新目錄或類似的東西嗅探器進程的思想。
如果不創建文件,那麼你的意思是什麼「獨一無二」?你的意思是「與該目錄中的所有其他文件名不同」? – lindelof 2009-08-18 13:08:45
我想創建唯一的文件名:「與該目錄中的所有其他文件名不同「 - 準確地說, – 2009-08-18 13:18:08
@mykhaylo:意識到如果你沒有立即使用你獲得的唯一文件名來創建一個文件,那麼可能會有另一個具有該名稱的文件可能會彈出到existenc即即使提供的一些答案也沒有考慮到這種可能性。 – 2009-08-18 16:16:26