2013-03-21 76 views
3

我正在尋找一個萬無一失的方法來生成,將有總是在每個JVM基礎的唯一名稱結束了一個臨時文件。基本上,我想確保在多線程應用程序中,如果兩個或更多線程試圖在同一時刻創建臨時文件,它們都將以唯一臨時文件結束,並且不會拋出異常。Java的臨時文件多線程應用程序

這是我的方法目前有:

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

+0

我認爲這個問題是在這裏找到答案:http://stackoverflow.com/questions/4702537/is-createtempfile-thread-safe – 2013-03-21 17:15:55

+0

根據javadoc的這種方法可能會拋出異常,因此你的代碼應該是能夠處理這些例外。比重名等原因,可能會出現錯誤,例如磁盤故障等 編輯:另外這個方法是靜態的,所以線程(如果你信任你的JDK實現) – 2013-03-21 17:16:56

+0

@AndreasBakurov - 僅僅因爲一個方法被標記'static'不**使它線程安全。實際上,標記「static」通常是線程/併發錯誤的原因。 – 2013-03-21 17:28:41

回答

3

答案發布在下面的URL回答我的問題。我發佈的方法在多線程的單個JVM進程環境中是安全的。爲了在多線程多JVM流程環境(例如集羣Web應用程序)中保證安全,您可以使用Chris Cooper的想法,該思路包括在每個JVM進程中的File.createTempFile方法的前綴參數中傳遞一個唯一值。

Is createTempFile thread-safe?

2

只需使用線程名和當前時間以毫秒來命名文件。

+0

那麼這是否意味着我的方法並不能完全防止多線程情況下文件名衝突的可能性? 我想避免不必要的唯一文件名生成或循環,以確保這項工作。如果這是絕對必要的我會做,但我試圖保持儘可能乾淨。 – Kabron 2013-03-26 14:11:32

2

出於這個確切原因,您可以爲臨時文件提供不同的前綴或後綴。 爲每個啓動的進程分配一個唯一的ID,並將該唯一ID用作前綴或後綴,同一虛擬機中的多個線程不會發生衝突,現在虛擬機也不會發生衝突。

+0

我更感興趣的是知道我擁有的方法在單個多線程JVM進程中是否完全安全。 – Kabron 2013-03-26 14:05:26