2012-03-07 47 views
24

我需要創建一個臨時文件,所以我嘗試這樣做:如何在java中創建一個沒有隨機數的文件名的臨時文件?

String[] TempFiles = {"c1234c10","c1234c11","c1234c12","c1234c13"}; 
for (int i = 0; i <= 3; i++) { 
    try { 
     String tempFile = TempFiles[i]; 
     File temp = File.createTempFile(tempFile, ".xls"); 
     System.out.println("Temp file : " + temp.getAbsolutePath()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

輸出是這樣的:

Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c108415816200650069233.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c113748833645638701089.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c126104766829220422260.xls 
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c137493179265536640669.xls 

現在,我不希望額外的數字(長整型)它正在被添加到文件名中。我怎樣才能做到這一點?謝謝

回答

28

首先,使用下面的代碼片段,以獲得系統的臨時目錄:

String tDir = System.getProperty("java.io.tmpdir"); 

然後結合使用​​變量與tempFiles[]陣列單獨創建每個文件。

+0

謝謝!有效。 – 2012-03-07 03:58:47

+2

退出後,所有這些手動創建的文件會自動刪除嗎? (我這樣認爲,但只是爲了確定,如果有人可以確認)。 – Larry 2013-05-27 15:58:29

+4

只是要注意,如果你這樣做,你沒有使用File.createTempFile,但創建文件的其他方式。 – JohnK 2014-05-15 14:19:24

4

如果您希望在系統範圍內的臨時目錄中創建具有特定名稱的文件,請擴展%temp%環境變量並手動創建該文件,沒有任何問題。

編輯:其實,使用System.getProperty("java.io.tmpdir"));

+1

,將設置臨時文件的位置,但它不會佔插入到文件名多餘的數字。 – jmq 2012-03-07 02:39:22

+1

我相信你從來沒有完全讀過我的答案。 – Irfy 2012-03-07 02:51:33

+1

我讀過它。我誤解了你的答案。 – jmq 2012-03-07 04:23:31

15

如果使用File.createTempFile生成臨時文件名,則不能使用。我看着生成臨時文件的Java源(用於Java 1.7,你不說出你的版本,所以我只是用我的):

private static class TempDirectory { 
    private TempDirectory() { } 

    // temporary directory location 
    private static final File tmpdir = new File(fs.normalize(AccessController 
     .doPrivileged(new GetPropertyAction("java.io.tmpdir")))); 
    static File location() { 
     return tmpdir; 
    } 

    // file name generation 
    private static final SecureRandom random = new SecureRandom(); 
    static File generateFile(String prefix, String suffix, File dir) { 
     long n = random.nextLong(); 
     if (n == Long.MIN_VALUE) { 
      n = 0;  // corner case 
     } else { 
      n = Math.abs(n); 
     } 
     return new File(dir, prefix + Long.toString(n) + suffix); 
    } 
} 

這是Java JDK生成的臨時文件中的代碼名稱。您可以看到它會生成一個隨機數並將其插入到前綴和後綴之間的文件名中。這是在「File.java」(在java.io中)。我沒有看到任何改變這種情況的方法。

0

自定義名稱可以保存如下

File temp=new File(tempFile, ".xls"); 
if (!temp.exists()) { 
    temp.createNewFile(); 
} 
+0

好又簡單。 – huahsin68 2016-05-04 06:09:54

+0

Downvote。對'temp.exists()'的調用引入了一個競爭條件,即temp.createNewFile()是專門爲避免而設計的。只需檢查'temp.createNewFile()'的返回值。閱讀'createNewFile()'的規範。重要的詞是* atomic *。 https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile%28%29 – 2018-01-25 16:12:01

3

使用Guava

import com.google.common.io.Files; 

... 

File myTempFile = new File(Files.createTempDir(), "MySpecificName.png"); 
+0

感謝您節省我的一天! – realPK 2017-11-10 05:03:54

0

您可以創建一個臨時目錄,然後在其存儲新的文件。這樣,您添加的所有新文件都不會有任何擴展名。當你完成所有你需要做的就是刪除你添加的臨時目錄。

public static File createTempFile(String prefix, String suffix) {  
    File parent = new File(System.getProperty("java.io.tmpdir")); 

    File temp = new File(parent, prefix + suffix); 

    if (temp.exists()) { 
     temp.delete(); 
    } 

    try { 
     temp.createNewFile(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

    return temp; 
} 


public static File createTempDirectory(String fileName) {  
    File parent = new File(System.getProperty("java.io.tmpdir")); 

    File temp = new File(parent, fileName); 

    if (temp.exists()) { 
     temp.delete(); 
    } 

    temp.mkdir(); 

    return temp; 
} 
0
public static File createTempDirectory(String dirName) { 
     File baseDir = new File(System.getProperty("java.io.tmpdir")); 
     File tempDir = new File(baseDir, dirName); 
     if (tempDir.mkdir()) { 
      return tempDir; 
     } 
     return null; 
} 
+1

爲代碼添加一些說明對OP會有幫助。 – SANM2009 2018-03-08 11:01:11

+0

感謝您使用此代碼段,這可能會提供一些有限的短期幫助。通過展示*爲什麼*這是一個很好的解決方案,並且使它對未來的讀者更有用,一個正確的解釋[將大大提高](// meta.stackexchange.com/q/114762)其長期價值其他類似的問題。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 – 2018-03-08 11:44:32

相關問題