2008-08-28 14 views
5

मैं वर्तमान में एक सरल HTTP GET करने के लिए निम्न फ़ंक्शन का उपयोग करता हूं।क्या सभी वर्ण पढ़ने के दौरान InputStreamReader पर BufferedReader का उपयोग करने का कोई कारण है?

public static String download(String url) throws java.io.IOException { 
    java.io.InputStream s = null; 
    java.io.InputStreamReader r = null; 
    //java.io.BufferedReader b = null; 
    StringBuilder content = new StringBuilder(); 
    try { 
     s = (java.io.InputStream)new URL(url).getContent(); 

     r = new java.io.InputStreamReader(s); 
     //b = new java.io.BufferedReader(r); 

     char[] buffer = new char[4*1024]; 
     int n = 0; 
     while (n >= 0) { 
      n = r.read(buffer, 0, buffer.length); 
      if (n > 0) { 
       content.append(buffer, 0, n); 
      } 
     } 
    } 
    finally { 
     //if (b != null) b.close(); 
     if (r != null) r.close(); 
     if (s != null) s.close(); 
    } 
    return content.toString(); 
} 

मैं के बाद से मैं सिर्फ अनुक्रम में सब कुछ डाउनलोड करने के लिए जा रहा हूँ BufferedReader उपयोग करने के लिए कोई कारण नहीं देखते हैं। क्या मैं सोच रहा हूं कि इस मामले में BufferedReader के लिए कोई उपयोग नहीं है?

उत्तर

4

इस मामले में, जैसा कि आप कर रहे हैं मैं करूँगा (बफरिंग के लिए बाइट सरणी का उपयोग करें और स्ट्रीम बफर में से एक नहीं)।

हालांकि अपवाद हैं। एक स्थान जिसे आप बफर देखते हैं (इस बार आउटपुट) सर्वलेट एपीआई में है। डाटा आप उत्पादन बफ़र लेकिन फिर बफर डंप एक त्रुटि होती है तो और इसके बजाय एक त्रुटि पृष्ठ लिखने के लिए अनुमति देता है जब तक फ्लश() कहा जाता है अंतर्निहित धारा के लिए लिखा नहीं है,। यदि आपको चिह्न (int) और रीसेट() का उपयोग कर रीडिंग के लिए स्ट्रीम रीसेट करने की आवश्यकता है तो आप इनपुट बफर कर सकते हैं। उदाहरण के लिए, हो सकता है कि आप कौन से सामग्री हैंडलर को स्ट्रीम पास करने के लिए निर्णय लेने से पहले फ़ाइल शीर्षलेख का निरीक्षण करेंगे।

असंबद्ध, लेकिन मुझे लगता है कि आपको अपनी स्ट्रीम हैंडलिंग को फिर से लिखना चाहिए। यह पैटर्न संसाधन लीक से बचने के लिए सबसे अच्छा काम करता है:

InputStream stream = new FileInputStream("in"); 
    try { //no operations between open stream and try block 
     //work 
    } finally { //do nothing but close this one stream in the finally 
     stream.close(); 
    } 

आप एक से अधिक धाराओं, घोंसला ट्राई/अंत में ब्लॉक खोल रहे हैं।

एक और बात अपने कोड क्या कर रहा है इस धारणा है कि लौटे सामग्री अपने वी एम के डिफ़ॉल्ट वर्ण सेट में एन्कोड किया गया है (कि हालांकि पर्याप्त हो सकता है, उपयोग के मामले के आधार पर) कर रही है।

1

आप सही हैं, यदि आप HTTP सामग्री और हेडर पढ़ने के लिए BufferedReader का उपयोग करते हैं तो आप इनपुटस्ट्रीम रीडर चाहते हैं ताकि आप बाइट के लिए बाइट पढ़ सकें।

इस परिदृश्य में BufferedReader कभी-कभी अजीब चीजें करता है ... विशेष रूप से जब HTTP पोस्ट हेडर पढ़ने की बात आती है, तो कभी-कभी आप इनपुट डेटा पढ़ने में असमर्थ होंगे, अगर आप इनपुटस्ट्रीम रीडर का उपयोग करते हैं तो आप सामग्री की लंबाई पढ़ सकते हैं और उसे पढ़ सकते हैं कई बाइट्स ...

0

मेरा आंत मुझे बताता है कि चूंकि आप पहले से ही बाइट सरणी का उपयोग कर बफरिंग कर रहे हैं, तो यह BufferedReader का उपयोग करने के लिए अनावश्यक है।

1

InputStreamReader की पढ़ने() विधियों में से प्रत्येक का प्रत्येक आमंत्रण अंतर्निहित बाइट-इनपुट स्ट्रीम से एक या अधिक बाइट्स को पढ़ सकता है। पात्रों को बाइट्स के कुशल रूपांतरण को सक्षम करने के लिए और अधिक बाइट्स अंतर्निहित धारा से आगे पढ़ा जा सकता है की तुलना में वर्तमान पढ़ने आपरेशन को पूरा करने के लिए आवश्यक हैं।