Java में Temp फ़ाइल बनाने का एक सुरक्षित तरीका क्या है?


96

मैं जावा में एक अस्थायी फ़ाइल बनाने का एक सुरक्षित तरीका खोज रहा हूँ । सुरक्षित रूप से, मेरा मतलब निम्नलिखित है:

  • संभावित दौड़ की शर्तों के तहत भी नाम अद्वितीय होना चाहिए (जैसे एक और थ्रेड एक ही समय में एक ही फ़ंक कहता है, या कोई अन्य प्रक्रिया इस कोड को एक साथ चलाता है)
  • संभावित दौड़ शर्तों के तहत फ़ाइल निजी होनी चाहिए, (उदाहरण के लिए कोई अन्य उपयोगकर्ता उच्च दर पर फ़ाइल को चोदने की कोशिश करता है)
  • मैं इसे फ़ाइल को हटाने के लिए कह सकता हूं, मेरे बिना एक जेनेरिक डिलीट करने के लिए, और गलत फ़ाइल को हटाने का जोखिम
  • आदर्श रूप से, यह सुनिश्चित करना चाहिए कि फ़ाइल को हटा दिया जाए, भले ही मुझे मौका मिलने से पहले अपवाद फेंक दिया गया हो
  • फ़ाइल को एक स्थान पर डिफ़ॉल्ट होना चाहिए (जैसे JVM निर्दिष्ट tmp dir, सिस्टम अस्थायी डीआईआर के लिए डिफ़ॉल्ट)

3
का उपयोग करें File f = File.createTempFile(prefix, extension)। इसे टेंपर डायर में रखा जाएगा। और इसके साथ f.deleteOnExit()बाहर निकलने पर स्वचालित रूप से हटा दिया जाएगा।
बैकस्लैश

3
एक्सिट पर डिलीट फाइल को डिलीट नहीं करेगा, अगर vm एक अपवाद के साथ बाहर निकलता है।
जोहान्स

जवाबों:


129

का उपयोग करें File.createTempFile()

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

टेम्प फाइल में फाइल बनाएंगे, जैसे:

उपसर्ग-6340763779352094442-प्रत्यय


1
बस FYI करें, आपको एक अद्वितीय उपसर्ग / प्रत्यय होने के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि जावा बीच में संख्याओं का एक यादृच्छिक स्ट्रिंग बना देगा।
स्क्विज़र

4
उत्तम! किसी भी समस्या के tempFile.delete()अलावा एक सामान्य कर रही है deleteOnExit(क्योंकि मैं बाहर निकलने से पहले चारों ओर लटका अस्थायी फ़ाइलों की भीड़ नहीं करना चाहता)?
SRobertJames 8:11 बजे

2
नहीं, आप इसे किसी भी तरह से कर सकते हैं।
स्टीफन

1
@SRobertJames: कोई समस्या नहीं। बात यह है कि पूर्वानुमानित नामों वाले टेम्पोफाइल्स का निर्माण सुरक्षा समस्याओं को जन्म देता है। एक बार जब वे उचित अनुमतियों के साथ सुरक्षित तरीके से बन जाते हैं, तो वे नहीं करते हैं।
मार्कस डब्ल्यू महलबबर्ग

1
मैं इसे सुरक्षित नहीं मानूंगा, बनाई गई फ़ाइल विश्व-पठनीय है और यह tmp निर्देशिका में रहती है जो किसी भी उपयोगकर्ता के लिए सुलभ हो जाती है।
पीटर गेरबर

37

जावा 7 के बाद से नई फ़ाइल एपीआई "एनआईओ 2" है जिसमें अस्थायी फाइल और निर्देशिका बनाने के लिए नए तरीके हैं। देख

जैसे

Path tempDir = Files.createTempDirectory("tempfiles");

या

Path tempFile = Files.createTempFile("tempfiles", ".tmp");

1
मुझे NIO पसंद है, जिसमें किसी उपसर्ग की आवश्यकता नहीं है।
फ्रैंकलिन यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.