Załóżmy, że utworzę plik tymczasowy w Javie za pomocą metody
File tmp = File.createTempFile(prefix, suffix);
Jeśli nie wywołam tej delete()
metody bezpośrednio, kiedy plik zostanie usunięty?
Zgodnie z intuicją może to nastąpić, gdy JVM zakończy działanie, lub wcześniej (przez moduł wyrzucania elementów bezużytecznych) lub później (przez jakiś proces czyszczenia systemu operacyjnego).
java
garbage-collection
temporary-files
Alphaaa
źródło
źródło
Odpowiedzi:
Plik nie zostanie automatycznie usunięty z JavaDoc :
Więc musisz jawnie wywołać deleteOnExit () :
źródło
Jak zauważają inni odpowiedzi, pliki tymczasowe utworzone za pomocą nie
File.createTempFile()
będą zostać automatycznie usunięte, chyba że wyraźnie o to poproszą.Rodzajową, przenośny sposób to zrobić, to zadzwonić
.deleteOnExit()
naFile
obiekcie, który zaplanuje plik do usunięcia, gdy JVM kończy. Niewielką wadą tej metody jest jednak to, że działa ona tylko wtedy, gdy maszyna wirtualna kończy normalnie; w przypadku nieprawidłowego zakończenia (tj. awarii maszyny wirtualnej lub wymuszonego zakończenia procesu maszyny wirtualnej) plik może pozostać nieusunięty.W systemach Unixish (takich jak Linux) w rzeczywistości możliwe jest uzyskanie nieco bardziej niezawodnego rozwiązania poprzez usunięcie pliku tymczasowego natychmiast po jego otwarciu . Działa to, ponieważ uniksowe systemy plików pozwalają na usunięcie pliku ( dokładniej mówiąc, odłączenie go), gdy jest on nadal otwarty przez jeden lub więcej procesów. Dostęp do takich plików można uzyskać normalnie przez otwarty uchwyt pliku, a miejsce, które zajmują na dysku, zostanie odzyskane przez system operacyjny dopiero po ostatnim procesie trzymającym otwarte dojście do wyjścia pliku.
Oto najbardziej niezawodny i przenośny sposób, jaki znam, aby upewnić się, że plik tymczasowy zostanie poprawnie usunięty po zamknięciu programu:
import java.io.File; import java.io.RandomAccessFile; import java.io.IOException; public class TempFileTest { public static void main(String[] args) { try { // create a temp file File temp = File.createTempFile("tempfiletest", ".tmp"); String path = temp.getAbsolutePath(); System.err.println("Temp file created: " + path); // open a handle to it RandomAccessFile fh = new RandomAccessFile (temp, "rw"); System.err.println("Temp file opened for random access."); // try to delete the file immediately boolean deleted = false; try { deleted = temp.delete(); } catch (SecurityException e) { // ignore } // else delete the file when the program ends if (deleted) { System.err.println("Temp file deleted."); } else { temp.deleteOnExit(); System.err.println("Temp file scheduled for deletion."); } try { // test writing data to the file String str = "A quick brown fox jumps over the lazy dog."; fh.writeUTF(str); System.err.println("Wrote: " + str); // test reading the data back from the file fh.seek(0); String out = fh.readUTF(); System.err.println("Read: " + out); } finally { // close the file fh.close(); System.err.println("Temp file closed."); } } catch (IOException e) { e.printStackTrace(); } } }
W systemie Unixish uruchomienie tego powinno dać coś podobnego do następującego wyniku:
podczas gdy w systemie Windows dane wyjściowe wyglądają nieco inaczej:
Jednak w obu przypadkach plik tymczasowy nie powinien pozostać na dysku po zakończeniu działania programu.
Ps. Podczas testowania tego kodu w systemie Windows zauważyłem dość zaskakujący fakt: najwyraźniej samo pozostawienie niezamkniętego pliku tymczasowego wystarczy, aby zapobiec jego usunięciu . Oczywiście oznacza to również, że każda awaria, która zdarzy się, gdy plik tymczasowy jest używany, spowoduje, że pozostanie on nieusunięty, czego właśnie staramy się tutaj uniknąć .
AFAIK, jedynym sposobem uniknięcia tego jest upewnienie się, że plik tymczasowy jest zawsze zamykany za pomocą
finally
bloku. Oczywiście równie dobrze możesz usunąć plik z tego samegofinally
bloku. Nie jestem pewien, co, jeśli w ogóle cokolwiek,.deleteOnExit()
mogłoby cię przez to przekonać.źródło
deleteOnExit()
, jest to, że jeśli jest wywoływana często (powiedzmy w systemie, który używa wielu nowych plików tymczasowych), prawdopodobnie spowoduje to wyciek pamięci (ponieważ musi zapamiętać wszystkie ścieżki, które muszą być usunięte).Nie zrobi tego, przynajmniej nie przez Javę. Jeśli chcesz, aby plik został usunięty po zakończeniu działania maszyny JVM, musisz zadzwonić
tmp.deleteOnExit()
.źródło
z: Jak usunąć plik tymczasowy w Javie
Na przykład,
File temp = File.createTempFile("abc", ".tmp"); temp.deleteOnExit();
Powyższy przykład utworzy plik tymczasowy o nazwie „abc.tmp” i usunie go, gdy program zostanie zakończony lub zamknięty .
Jeśli chcesz ręcznie usunąć plik tymczasowy , nadal możesz użyć funkcji File.delete ().
źródło
Plik tymczasowy służy do przechowywania mniej ważnych i tymczasowych danych, które zawsze powinny zostać usunięte po zamknięciu systemu. Najlepszą praktyką jest użycie do tego metody File.deleteOnExit ().
Na przykład,
File temp = File.createTempFile("abc", ".tmp"); temp.deleteOnExit();
Powyższy przykład utworzy plik tymczasowy o nazwie „abc.tmp” i usunie go, gdy program zostanie zakończony lub zamknięty.
źródło
Jeśli chcesz, możesz ręcznie usunąć plik przed zakończeniem procesu, jednak po zakończeniu procesu plik zostanie również usunięty.
źródło
deleteOnExit()