10

何百もの一時ファイルを数秒で作成するマルチスレッド Java プログラムがあります。ファイルは に配置され/tmpSystem.nanoTime().

ファイル名は一意であることが保証されていますか?

4

4 に答える 4

18

いいえ、すべての呼び出しがSystem.nanoTime()一意の値を返すという保証はありません。

代わりにFile.createTempFile()またはを使用してください。Files.createTempFile()これらはまさにこの目的のために設計されており、一意のファイル名を生成します。

于 2013-03-19T07:25:44.757 に答える
3

一時ファイルに一意のファイル名が必要な場合は、File.createTempFile(prefix, suffix, directory)を使用します。

于 2013-03-19T07:27:06.323 に答える
3

元の質問について

いいえ、そうではありません。スレッドはマルチ CPU/コア システムで同時に並行して実行される可能性があるため、一意の値が保証されません。

さらに、nanoTime()下にある時計と同じくらい正確です。つまり、nanoTime を 2 回連続して呼び出すと、同じ値が返される可能性があります。

APIからの引用:「値がどのくらいの頻度で変更されるかは保証されません。」

解決

Javaを使用File.createTempFile()して、一時ファイルの一意性を処理する必要があります。

// create temp file in /tmp with prefix  tmpfile and suffix .txt
File file = File.createTempFile("tmpfile", ".txt", new File("/tmp"));

// deletes file when the virtual machine terminate
file.deleteOnExit();

スレッド ID などをプレフィックスとして使用して、これらの temFiles を区別することもできます。

于 2013-03-19T07:28:53.090 に答える
1

ナノ秒ごとに複数のファイルを作成できるマシンでスレッド システムを実行すると、名前の競合が発生する可能性があります。

これに対する解決策は、ファイル名の先頭/末尾に追加するために使用できる静的な「インデックス カウンター」を保存することです。

例として、ファイル名は、メソッドがインデックスの値を返し、それをインクリメントするSystem.nanoTime() + "x" + SomeClassName.index()場所である可能性があります。(戻り値を a にするか、値を 1 に変換するindex()ことで、"x" を捨てることができます)。index()String

プログラムが再起動するたびに「インデックスカウンター」が0にリセットされても問題ありません(JVMインスタンスがナノ秒未満で起動できるかどうかは本当に疑問です)。

index()メソッドをスレッドセーフ にするようにしてください。

編集:

私のソリューションは、一意のファイル名を生成する方法を提供します。同様のソリューションを使用して (代わりに "System.currentTimeMillis()" を使用System.nanoTime())、データベースで一時的な表現を持つ変数の一意の ID を生成しています。これは魅力のように機能します (プレフィックスを使用すると、 DB を空にするだけでなく、DB 内の特定のエントリ)。

ファイル名自体には興味がなく、一時ファイルの所有/使用のみに興味がある場合は、NPE のソリューションを使用します。

于 2013-03-19T07:34:14.487 に答える