Java SWTを使用してアプリケーションを記述します。一意のファイル名を作成したいのですが、ハードドライブに作成したくありません。追加機能:指定フォルダに一意のファイル名を作成したい。
public String getUniqueFileName(String directory, String extension) {
//create unique file name
}
あなたの質問から、私はあなたが File.createTempFile()
は単に名前を生成することを許可するのではなく常にファイルを作成することを見たことがあると思います。
しかし、なぜメソッドを呼び出してから、作成された一時ファイルを削除しないのですか? createTempFile()
は、指定されたディレクトリで一意のファイル名を見つけるためのすべての作業を行います。ファイルを作成したので、ファイルを削除することもできます。
File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
ファイル名にタイムスタンプを使用しますか?
もちろん、同時実行性が非常に高い場合、これは機能しない可能性があります。
例えば:
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();
}
AS John Oxleyの回答が示唆しています。 [〜#〜] uuid [〜#〜] は、4つの異なるスキームを使用して作成できるため、解決策になる場合があります。まだ衝突の可能性はわずかですが。タイムスタンプとランダムなUUIDを組み合わせると、衝突が発生する可能性はほとんどなくなります。
ファイル名に [〜#〜] guid [〜#〜] を使用してみてください。
他の回答を簡略化GUIDを使用。 imho UUID
にsaltを追加する必要はありません。これは私が使っているものです:
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;
}
この手順は、並行性があっても通常のシナリオで機能するはずです。新しいディレクトリまたは同様のものを占有するスニファープロセスで考え始めない限り。
任意の名前(時間、GUIDなど)でファイルを作成し、それをテストして、すでに存在するかどうかを確認できます。存在する場合は、別の名前を試して、一意かどうかを確認してください。
File f = new File(guid);
if (f.exists()) {
//try another guid
}else{
//you're good to go
}
Java 7 から利用可能なパスAPI)を使用して、一意に生成された名前で一時パスファイルを生成できます。
Files
ユーティリティクラスは Files.createTempFile
を提供します。これは、Pathオブジェクトを生成することを除いて、File.createTempFile
と同様に機能します。
したがって、メソッドを呼び出す
Path baseDir = ...
Files.createTempFile(baseDir, "status-log-", ".log");
// //dir path, prefix , suffix
に似たものを生成します
C:\...\status-log-4746781128777680321.log
ファイルを開いて、ファイルの使用後に削除したい場合は、ドキュメントから取得したDELETE_ON_CLOSE
を使用できます。
File.createTempFileメソッドと同様に、このメソッドは一時ファイル機能の一部にすぎません。作業ファイルとして使用する場合、結果のファイルはDELETE_ON_CLOSEオプションを使用して開くことができるため、適切なcloseメソッドが呼び出されたときにファイルが削除されます。あるいは、shutdown-hook、またはFile.deleteOnExitメカニズムを使用して、ファイルを自動的に削除することもできます。