3

私は、JVMごとに常に一意の名前で終わる一時ファイルを生成するための絶対確実な方法を探しています。基本的に、マルチスレッドアプリケーションで、2つ以上のスレッドがまったく同じ時点で一時ファイルを作成しようとすると、両方が一意の一時ファイルになり、例外がスローされないことを確認したいと思います。

これは私が現在持っている方法です:

public File createTempFile(InputStream inputStream) throws FileUtilsException {
    File tempFile = null;
    OutputStream outputStream = null;
    try {
        tempFile = File.createTempFile("app", ".tmp");
        tempFile.deleteOnExit();
        outputStream = new FileOutputStream(tempFile);
        IOUtils.copy(inputStream, outputStream);
    } catch (IOException e) {
        logger.debug("Unable to create temp file", e);
        throw new FileUtilsException(e);
    } finally {
        try { if (outputStream != null) outputStream.close(); } catch (Exception e) {}
        try { if (inputStream != null) inputStream.close(); } catch (Exception e) {}
    }
    return tempFile;
}

これは私の目標にとって完全に安全ですか?以下のURLのドキュメントを確認しましたが、よくわかりません。

java.io.File#createTempFileを参照してください

4

3 に答える 3

3

以下の URL に投稿された回答は、私の質問に対する回答です。私が投稿した方法は、マルチスレッドの単一 JVM プロセス環境で安全です。マルチスレッドのマルチ JVM プロセス環境 (クラスター化された Web アプリなど) で安全にするために、各 JVM プロセス内の File.createTempFile メソッドのプレフィックス引数に一意の値を渡すことを含む Chris Cooper のアイデアを使用できます。

createTempFile はスレッドセーフですか?

于 2013-03-26T17:42:40.310 に答える
2

この正確な理由から、一時ファイルに別のプレフィックスまたはサフィックスを指定できます。起動する各プロセスに一意の ID を割り当て、その一意の ID をプレフィックスまたはサフィックスとして使用すると、同じ VM 内の複数のスレッドが衝突せず、VM も衝突しなくなります。

于 2013-03-21T17:13:30.137 に答える
2

スレッド名とミリ秒単位の現在の時刻を使用して、ファイルに名前を付けるだけです。

于 2013-03-21T17:11:25.437 に答える