2012-03-07 6 views
24

muszę utworzyć plik temp, więc próbowałem to:Jak utworzyć plik tymczasowy w języku Java bez losowej liczby dołączonej do nazwy pliku?

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

Wyjście jest coś takiego:

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 

Teraz nie chcę dodatkowych numerów (long int) która jest dodawana do nazwy pliku. Jak mogę to osiągnąć? Dzięki

Odpowiedz

28

pierwsze, należy użyć następującego fragmentu kodu, aby uzyskać tymczasowym katalogu systemu:

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

Następnie użyć zmiennej tDir w połączeniu ze swojej tablicy tempFiles[] stworzyć każdy plik osobno.

+0

Dzięki! Zadziałało. –

+2

Czy wszystkie te ręcznie utworzone pliki zostaną automatycznie usunięte po wyjściu? (Zakładam, że tak, ale żeby się upewnić, czy ktoś może to potwierdzić). – Larry

+4

Należy pamiętać, że jeśli to zrobisz, nie używasz File.createTempFile, ale w inny sposób do utworzenia pliku. – JohnK

4

Jeśli chcesz, aby pliki o określonych nazwach zostały utworzone w ogólnosystemowym katalogu tymczasowym, rozwiń zmienną środowiskową %temp% i utwórz plik ręcznie, nic w tym złego.

Edytuj: Właściwie użyj do tego celu System.getProperty("java.io.tmpdir"));.

+1

To będzie ustawić lokalizację pliku temp, ale nie będą stanowić dodatkowych numerów wprowadzonych do nazwy pliku. – jmq

+1

Uważam, że nigdy nie czytasz mojej odpowiedzi w całości. – Irfy

+1

Przeczytałem to. Źle zrozumiałem twoją odpowiedź. – jmq

15

Nie można, jeśli używa się File.createTempFile do generowania tymczasowej nazwy pliku. Spojrzałem w źródle Java dla generowania pliku tymczasowego (na Java 1.7, nie podała swoją wersję, więc po prostu stosować moje):

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

jest to kod w JDK Java, który generuje plik temp Nazwa. Możesz zobaczyć, że generuje on losową liczbę i wstawia ją do nazwy pliku między prefiksem i sufiksem. To jest w "File.java" (w java.io). Nie widziałem żadnego sposobu, żeby to zmienić.

0

nazwy niestandardowe można zapisać następująco

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

Ładne i proste. – huahsin68

+0

Dochód. Wywołanie 'temp.exists()' wprowadza warunek wyścigu, że 'temp.createNewFile()' został specjalnie zaprojektowany, aby uniknąć. Po prostu sprawdź wartość zwracaną przez 'temp.createNewFile()'. Przeczytaj specyfikację 'createNewFile()'. Ważne słowo to * atomowy *. https://docs.oracle.com/javase/7/docs/api/java/io/File.html#createNewFile%28%29 –

3

Korzystanie Guava:

import com.google.common.io.Files; 

... 

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

Dzięki za uratowanie mojego dnia! – realPK

0

Można utworzyć katalog temp następnie zapisać nowe pliki w nim. W ten sposób wszystkie nowe pliki, które dodasz, nie będą miały losowego rozszerzenia. Kiedy skończysz, wszystko co musisz zrobić, to usunąć dodany katalog temp.

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

Dodanie objaśnień do kodu byłoby pomocne dla OP. – SANM2009

+0

Dziękujemy za ten fragment kodu, który może zapewnić krótkoterminową pomoc w ograniczonym zakresie. Właściwe wyjaśnienie znacznie poprawi (// meta.stackexchange.com/q/114762) jego długoterminową wartość, pokazując * dlaczego * jest to dobre rozwiązanie problemu i sprawiłoby, że byłby bardziej przydatny dla przyszłych czytelników z inne, podobne pytania. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienia, w tym założenia, które podjąłeś. –

Powiązane problemy