2012-03-07 27 views
24

Ho bisogno di creare un file temporaneo, quindi ho provato questo:Come creare un file temporaneo in java senza il numero casuale aggiunto al nome file?

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(); 
    } 
} 

L'output è qualcosa di simile:

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 

Ora, io non voglio i numeri aggiuntivi (long int) che viene aggiunto al nome del file. Come posso ottenerlo? Grazie

risposta

28

In primo luogo, utilizzare il seguente frammento di ottenere directory temporanea del sistema:

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

quindi utilizzare la variabile tDir in congiunzione con il tempFiles[] array per creare ogni singolo file.

+0

Grazie! Ha funzionato. –

+2

Tutti questi file creati manualmente verranno automaticamente cancellati all'uscita? (Suppongo di sì, ma solo per essere sicuro, se qualcuno potrebbe confermare). – Larry

+4

Solo per notare che se si esegue questa operazione, non si utilizza File.createTempFile, ma un altro modo di creare il file. – JohnK

4

Se si desidera che i file con nomi specifici vengano creati nella directory temporanea del sistema, espandere la variabile di ambiente %temp% e creare il file manualmente, non c'è niente di sbagliato in questo.

Modifica: in realtà, utilizzare System.getProperty("java.io.tmpdir")); per quello.

+1

che impostare il percorso del file temporaneo, ma non inciderà per i numeri in più inseriti nel nome del file. – jmq

+1

Credo che tu non abbia mai letto completamente la mia risposta. – Irfy

+1

L'ho letto. Ho frainteso la tua risposta. – jmq

15

Non è possibile se si utilizza File.createTempFile per generare un nome di file temporaneo. Ho guardato il sorgente Java per generare un file temporaneo (per Java 1.7, non ha precisato la versione così ho solo mia utilizzato):

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); 
    } 
} 

Questo è il codice nel JDK Java che genera il file temporaneo nome. Si può vedere che genera un numero casuale e lo inserisce nel nome del file tra prefisso e suffisso. Questo è in "File.java" (in java.io). Non ho visto alcun modo per cambiarlo.

0

nomi personalizzati possono essere salvati come segue

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

Bello e semplice. – huahsin68

+0

A valle. La chiamata a 'temp.exists()' introduce una condizione di competizione che 'temp.createNewFile()' è stato specificamente progettato per evitare. Basta controllare il valore restituito da 'temp.createNewFile()'. Leggi le specifiche di 'createNewFile()'. La parola importante è * atomica *. https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile%28%29 –

3

Utilizzando Guava:

import com.google.common.io.Files; 

... 

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

Grazie per aver salvato la giornata! – realPK

0

è possibile creare una directory temp quindi memorizzare nuovi file in essa contenuti. In questo modo, tutti i nuovi file aggiunti non avranno un'estensione casuale. Quando hai finito, tutto ciò che devi fare è eliminare la directory temporanea che hai aggiunto.

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

L'aggiunta di alcune spiegazioni per il codice sarebbe utile per l'OP. – SANM2009

+0

Grazie per questo snippet di codice, che potrebbe fornire una guida limitata a breve termine. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –

Problemi correlati