अन्य उत्तर ध्यान दें के रूप में, के साथ बनाया अस्थायी फ़ाइलें File.createTempFile()
जाएगा नहीं अपने आप हटा दिया जब तक आप स्पष्ट यह अनुरोध करते हैं।
ऐसा करने का सामान्य, पोर्टेबल तरीका ऑब्जेक्ट .deleteOnExit()
पर कॉल करना File
है, जो जेवीएम समाप्त होने पर विलोपन के लिए फाइल शेड्यूल करेगा। इस पद्धति का एक मामूली नुकसान, हालांकि, यह केवल तभी काम करता है जब वीएम सामान्य रूप से समाप्त हो जाता है; एक असामान्य समाप्ति पर (यानी एक वीएम क्रैश या वीएम प्रक्रिया की मजबूर समाप्ति), फ़ाइल अनिर्धारित रह सकती है।
यूनिक्स सिस्टम (जैसे लिनक्स) पर, खोलने के तुरंत बाद अस्थायी फ़ाइल को हटाकर कुछ हद तक अधिक विश्वसनीय समाधान प्राप्त करना संभव है । यह काम करता है क्योंकि यूनिक्स फाइल सिस्टम एक फाइल को हटाने की अनुमति देता है ( अनलिंक किया गया , सटीक होने के लिए) जबकि यह अभी भी एक या अधिक प्रक्रियाओं द्वारा खुला रखा गया है। इस तरह की फाइलें खुले फाइलहैंडल के माध्यम से सामान्य रूप से एक्सेस की जा सकती हैं, और डिस्क पर वे जिस स्थान पर कब्जा करते हैं, उसे अंतिम प्रक्रिया के बाद केवल ओएस द्वारा पुनर्प्राप्त किया जाएगा।
इसलिए यहां सबसे विश्वसनीय और पोर्टेबल तरीका है जो मुझे यह सुनिश्चित करने के लिए पता है कि कार्यक्रम से बाहर निकलने के बाद एक अस्थायी फ़ाइल को ठीक से हटा दिया जाएगा:
import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;
public class TempFileTest
{
public static void main(String[] args)
{
try {
File temp = File.createTempFile("tempfiletest", ".tmp");
String path = temp.getAbsolutePath();
System.err.println("Temp file created: " + path);
RandomAccessFile fh = new RandomAccessFile (temp, "rw");
System.err.println("Temp file opened for random access.");
boolean deleted = false;
try {
deleted = temp.delete();
} catch (SecurityException e) {
}
if (deleted) {
System.err.println("Temp file deleted.");
} else {
temp.deleteOnExit();
System.err.println("Temp file scheduled for deletion.");
}
try {
String str = "A quick brown fox jumps over the lazy dog.";
fh.writeUTF(str);
System.err.println("Wrote: " + str);
fh.seek(0);
String out = fh.readUTF();
System.err.println("Read: " + out);
} finally {
fh.close();
System.err.println("Temp file closed.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Unixish सिस्टम पर, इसे चलाने से निम्न आउटपुट जैसा कुछ उत्पन्न होना चाहिए:
Temp file created: /tmp/tempfiletest587200103465311579.tmp
Temp file opened for random access.
Temp file deleted.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
विंडोज पर रहते हुए, आउटपुट थोड़ा अलग दिखता है:
Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp
Temp file opened for random access.
Temp file scheduled for deletion.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.
किसी भी स्थिति में, हालांकि, प्रोग्राम समाप्त होने के बाद अस्थायी फ़ाइल डिस्क पर नहीं रहनी चाहिए।
Ps। विंडोज पर इस कोड का परीक्षण करते समय, मैंने एक आश्चर्यजनक तथ्य देखा: जाहिरा तौर पर, केवल अस्थायी फाइल को छोड़ दिया गया , इसे हटाए जाने के लिए पर्याप्त है । बेशक, इसका मतलब यह भी है कि अस्थायी फ़ाइल के उपयोग के दौरान होने वाली कोई भी दुर्घटना इसे बिना छोड़े छोड़ दिया जाएगा, यही वह है जो हम यहां से बचने की कोशिश कर रहे हैं।
AFAIK, इससे बचने का एकमात्र तरीका यह सुनिश्चित करना है कि अस्थायी फ़ाइल हमेशा एक finally
ब्लॉक का उपयोग करके बंद हो जाती है । बेशक, तब आप फ़ाइल को उसी finally
ब्लॉक में भी डिलीट कर सकते हैं। मुझे यकीन नहीं है कि क्या, अगर कुछ भी, .deleteOnExit()
वास्तव में आप उस पर लाभ होगा।