2011-09-08 6 views
14

जावा में कई I/O संसाधन जैसे इनपुटस्ट्रीम और आउटपुटस्ट्रीम को समाप्त होने पर बंद होने की आवश्यकता है, जैसा कि here पर चर्चा की गई है।जावा में अनजान I/O संसाधन कैसे खोजें?

मैं उन स्थानों के लिए अपनी परियोजना कैसे खोज सकता हूं जहां ऐसे संसाधन बंद नहीं किए जा रहे हैं, उदा। त्रुटि के इस प्रकार:

private void readFile(File file) throws IOException { 
    InputStream in = new FileInputStream(file); 
    int nextByte = in.read(); 
    while (nextByte != -1) { 
     // Do something with the byte here 
     // ... 
     // Read the next byte 
     nextByte = in.read(); 
    } 
    // Oops! Not closing the InputStream 
} 

मैं ऐसे PMD और FindBugs के रूप में कुछ स्थिर विश्लेषण उपकरणों की कोशिश की है, लेकिन वे गलत होने के रूप में उपरोक्त कोड झंडा नहीं है।

+3

FindBugs इसका पता लगाने में सक्षम प्रतीत होता है, हालांकि: http://stackoverflow.com/questions/2570820/findbugs-may-fail-to-close-stream-is-this-valid-in-case-of- इनपुटस्ट्रीम – Thilo

+1

लगता है कि आपको कौन से नियमों को समायोजित करने की आवश्यकता है FindBugs –

उत्तर

1

जावा 7 में, वे इस तरह के रूप में मौजूदा दायरे में closable संसाधनों का उपयोग कर के एक सुविधा जोड़ी (ताकि कोशिश के साथ-संसाधनों कहा जाता है),:

public void someMethod() { 
    try(InputStream is = new FileInputStream(file)) { 
     //do something here 
    } // the stream is closed here 
} 

पुराने संस्करणों में, आम तकनीक try- उपयोग कर रहा है अंत में श्रृंखला पकड़ो।

+1

ठीक है, इसलिए अन्य शब्दों में मेरा प्रश्न जावा 6 या उससे पहले में है, मैं "आखिरकार अंत में कोशिश करें" तकनीक का उपयोग न करने के उदाहरण कैसे प्राप्त कर सकता हूं? –

+0

Google का कहना है कि FindBugs इस प्रकार की बग –

5

यह शायद सेटिंग सेटिंग है - मैंने अपने आईडीई प्लगइन के माध्यम से FindBugs चलाया और यह OS_OPEN_STREAM की सूचना दी।

+0

ढूंढने में सक्षम है क्या आप ढूँढ सकते हैं कि FindBugs में कौन सी सेटिंग की आवश्यकता है? आईएमओ, यह डिफ़ॉल्ट रूप से सक्षम होना चाहिए था, जब यह उलझन से बाहर चला गया तो एप्लिकेशन क्रैश के दुष्प्रभाव दिए गए। – bram

6

यदि संशोधित नियमों के साथ FindBugs आपके लिए काम नहीं करता है, तो एक और धीमी दृष्टिकोण ढेर विश्लेषण है। VisualVM आपको किसी विशिष्ट प्रकार की सभी ऑब्जेक्ट्स से पूछताछ करने की अनुमति देता है जो किसी भी समय ओक्यूएल का उपयोग करके एक हीप डंप के भीतर खुले होते हैं। फिर आप उन फ़ाइलों के लिए खुली धाराओं की जांच कर सकते हैं जिन्हें प्रोग्राम में उस बिंदु पर नहीं पहुंचाया जाना चाहिए।

यह चल रहा है के रूप में सरल है के रूप में:

%>jvisualvm 

चल प्रक्रिया का चयन करें। विकल्प चुनें हीप डंप (या उस प्रभाव से कुछ), हेप डंप खोलें और ब्राउज़र में फ़ाइल स्ट्रीम के लिए क्लास इंस्टेंस देखें, या उनके लिए पूछें।

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