2012-08-30 36 views
6

कोड का यह टुकड़ा BufferedReader और InputStreamReader के कारण स्मृति रिसाव के मुद्दों को बना रहा है जो मुझे लगता है कि कुछ अपवादों का कारण हो रहा है। मुझे इसे कैसे बदलना चाहिए?क्लोजिंग BufferedReader और इनपुटस्ट्रीम रीडर

try{ 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    while ((str = in.readLine()) != null) { 
     jsonString += str; 
    } 
    in.close(); 
}catch(Exception e){ 

} 
+1

पास ले जाने के किया जा सकता है() तर्क अंत में ब्लॉक करने के लिए? क्या आप निश्चित रूप से (या) कनेक्शन बंद करते समय कोई अपवाद नहीं हो रहे हैं? – kosa

+0

ने अपने कैच-क्लॉज में 'e.printStackTrace()' लिखने का प्रयास किया है ताकि यह देखने के लिए कि क्या अपवाद फेंक दिए गए हैं? –

उत्तर

12

यह एक try..finally ब्लॉक का उपयोग अपनी स्ट्रीम बंद करने के लिए सुरक्षित होगा। आप StringBuilder का भी उपयोग कर सकते हैं क्योंकि इसे तारों को संयोजित करने के लिए डिज़ाइन किया गया है। आपको Exception को पकड़ने और इसके साथ कुछ भी करने से बचने चाहिए। साथ ही, आपका कोड किसी लाइन-ब्रेक के बिना लाइनों को जोड़ रहा है। यह अच्छी तरह से नहीं आप क्या चाहते हैं, जिस स्थिति append("\n") में आप में प्रत्येक पंक्ति को पढ़ने के जब हो सकता है

यहाँ उन संशोधनों के साथ एक संस्करण है:।

StringBuilder json = new StringBuilder(); 
try { 
    URL url = new URL(sMyUrl); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    try { 
     String str; 
     while ((str = in.readLine()) != null) { 
      json.append(str).append("\n"); 
     } 
    } finally { 
     in.close(); 
    } 
} catch (Exception e) { 
    throw new RuntimeException("Failed to read JSON from stream", e); 
} 
+0

क्या मुझे इनपुटस्ट्रीम रीडर को बंद करने की आवश्यकता है? या बफर रीडर के रूप में बंद यह एक नई वस्तु पैदा करेगा? –

+4

'इनपुटस्ट्रीम रीडर' को स्पष्ट रूप से बंद करने की आवश्यकता नहीं है क्योंकि जब आप 'BufferedReader' को बंद करते हैं तो यह स्वचालित रूप से बंद हो जाएगा। –

+0

@ एथेरिया, धन्यवाद। किसी भी तरह मुझे एक अच्छा जावा स्ट्रीम ट्यूटोरियल की जरूरत है। –

5

कोड सुंदर नहीं है लेकिन मेमोरी रिसाव नहीं बनायेगा। मेरा सुझाव है कि आप यह निर्धारित करने के लिए मेमोरी प्रोफाइलर का उपयोग करें कि आपकी मेमोरी का उपयोग कहां किया जा रहा है। नहीं तो आप सिर्फ अनुमान लगा रहे हैं, भले ही आप जावा में दस वर्ष का अनुभव + प्रदर्शन ट्यूनिंग है;)

एक बेहतर विकल्प जावा 7

URL url = new URL(sMyUrl); 
try(BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} 

आप जावा 6 या उससे अधिक आप उपयोग कर सकते हैं, तो उपयोग करने के लिए है।

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { 
try { 
    while ((str = in.readLine()) != null) { 
    jsonString.append(str).append("\n"); 
    } 
} finally { 
    in.close(); 
} 
+0

'in = null' को सेट करने और फिर 'अंत में' ब्लॉक में शून्य के लिए जांच करने में बिल्कुल कोई लाभ नहीं है। 'BufferedReader' बनाने के तुरंत बाद' try' को तुरंत डालें। –

+0

धन्यवाद! क्या मुझे इनपुटस्ट्रीम रीडर को बंद करने की आवश्यकता है? –

+0

@ एथेरिया अच्छा बिंदु। फिक्सिंग। –