2011-01-14 17 views
19

क्या FileInputStream बंद होने पर स्वचालित रूप से अंतर्निहित फ़ाइल को हटाने का कोई मौजूदा तरीका है?क्या कोई मौजूदा फ़ाइल इनपुट स्ट्रीम बंद है?

मैं FileInputStream का विस्तार करने के लिए अपनी खुद की उपयोगिता कक्षा बनाने की योजना बना रहा था और इसे स्वयं करता हूं, लेकिन मुझे आश्चर्य है कि कुछ पहले से मौजूद नहीं है।

संपादित करें: केस का उपयोग करें कि मेरे पास स्ट्रैट्स 2 एक्शन है जो पृष्ठ से फ़ाइल डाउनलोड के लिए InputStream देता है। जहां तक ​​मैं कह सकता हूं, जब कार्रवाई समाप्त हो जाती है, तो मुझे अधिसूचित नहीं किया जाता है, या FileInputStream अब उपयोग में नहीं है, और मैं नहीं चाहता (संभावित रूप से बड़ी) अस्थायी फ़ाइलें जो डाउनलोड होने के लिए उत्पन्न होती हैं ।

प्रश्न स्ट्रैट्स 2 विशिष्ट नहीं था, इसलिए मैंने मूल रूप से उस जानकारी को शामिल नहीं किया और प्रश्न को जटिल बना दिया।

+0

क्या इस के लिए यूज-केस है? – skaffman

+2

@skaffman बल्कि स्पष्ट है, फ़ाइल को पढ़ने के बाद वह इसे हटाना चाहता है (जेम्स बॉन्ड-स्टाइल, यह टेप इस संदेश के बाद स्वयं को नष्ट कर देगा) –

+1

@ सेन: यह उपयोग-मामला नहीं है। एक उपयोग-मामला वह है जिसे उसने अभी प्रश्न में जोड़ा था। – skaffman

उत्तर

25

वहाँ अपाचे-कॉमन्स libs के किसी भी या तो मानक पुस्तकालयों में ऐसी कोई बात नहीं है, और नहीं है, तो कुछ की तरह:

public class DeleteOnCloseFileInputStream extends FileInputStream { 
    private File file; 
    public DeleteOnCloseFileInputStream(String fileName) throws FileNotFoundException{ 
     this(new File(fileName)); 
    } 
    public DeleteOnCloseFileInputStream(File file) throws FileNotFoundException{ 
     super(file); 
     this.file = file; 
    } 

    public void close() throws IOException { 
     try { 
      super.close(); 
     } finally { 
      if(file != null) { 
      file.delete(); 
      file = null; 
     } 
     } 
    } 
} 
+1

मैं बंद होने के बाद फ़ाइल को रद्द कर दूंगा, बस उस घटना में साफ होने के लिए जिसे करीब एक से अधिक बार बुलाया जाता है। –

+0

धन्यवाद। मैंने अपना खुद का लिखने की योजना बनाई थी, लेकिन मुझे आश्चर्य हुआ कि मानक libs में कुछ भी नहीं था। मैंने अपाचे कॉमन्स की जांच नहीं की थी। –

6

क्या आप फ़ाइल खोलने से पहले File.deleteOnExit() का उपयोग कर सकते हैं?

EDIT: आप एक FileInputStream को उपclass कर सकते हैं जो 'बंद()' पर फ़ाइल को हटा देगा;

class MyFileInputStream extends FileInputStream 
{ 
File file; 
MyFileInputStream(File file) { super(file); this.file=file;} 
public void close() { super.close(); file.delete();} 
} 
+0

"File.createTempFile" संभवतः भी उपयोगी हो सकता है। ऐसा लगता है जैसे शॉन डी को एक अस्थायी फ़ाइल की आवश्यकता है। – Stas

+1

नहीं, मैं नहीं कर सकता, क्योंकि यह एक लंबे समय से चलने वाला एप्लिकेशन है। –

3

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं सिर्फ भाग गया इस मुद्दे में, और एक और जवाब मिला: javax.ws.rs.core.StreamingOutput।

यहाँ कैसे मैं इसे इस्तेमाल किया है:

File downloadFile = ...figure out what file to download... 
    StreamingOutput so = new StreamingOutput(){ 
     public void write(OutputStream os) throws IOException { 
      FileUtils.copyFile(downloadFile, os); 
      downloadFile.delete(); 
    } 

    ResponseBuilder response = Response.ok(so, mimeType); 
    response.header("Content-Disposition", "attachment; filename=\""+downloadFile.getName()+"\""); 
    result = response.build(); 
+0

यह बहुत अच्छा है और केवल उस प्रकार के वर्ग जैसा दिखता है जिसका उपयोग वेब अनुरोध का उपयोग कर लौटने वाली अस्थायी फ़ाइलों से निपटने के लिए किया गया था! –

संबंधित मुद्दे