2011-06-02 13 views
5

मैं अपाचे एचटीपी क्लाइंट के साथ एक पृष्ठ प्राप्त कर रहा हूं और मैं सर्वर उत्तर के http body को स्ट्रिंग में संग्रहीत करना चाहता हूं ताकि मैं इस स्ट्रिंग में हेरफेर कर सकूं और इसे कंसोल पर प्रिंट करें।जावा में अपाचे एचटीपी क्लाइंट, instream.toString = org.apache.http.conn.EofSensorInputStream

17:52:01,862 INFO Driver:53 - fetchPage STARTING 
17:52:07,580 INFO Driver:73 - fetchPage ENDING, took 5716 
[email protected] 

fetchPage कक्षा::

public String fetchPage(String part){ 
    log.info("fetchPage STARTING"); 
    long start = System.currentTimeMillis(); 

    String reply; 

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(searchurl); 
    HttpResponse response; 
    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      int l; 
      byte[] tmp = new byte[2048]; 
      while ((l = instream.read(tmp)) != -1) { 
      } 
      long elapsedTimeMillis = System.currentTimeMillis()-start; 
      log.info("fetchPage ENDING, took " + elapsedTimeMillis); 
      reply = instream.toString(); 
      System.out.println(reply); 
      return reply; 
     } 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return null; 
} 
+6

यहाँ समझने के लिए कुंजी बात यह है कि 'toString()' एक 'InputStream पर 'स्ट्रिंग' के रूप में अपनी सामग्री को पढ़ने की विधि नहीं है, बल्कि ऑब्जेक्ट का एक सरल स्ट्रिंग प्रस्तुति प्राप्त करने के लिए। आम तौर पर (इस मामले में) एक 'इनपुटस्ट्रीम' में उपयोगी स्ट्रिंग प्रस्तुति नहीं होती है जो यह प्रदान कर सकती है, इसलिए यह केवल डिफ़ॉल्ट 'ऑब्जेक्ट .toString() 'का उपयोग करता है। – ColinD

उत्तर

10

आप InputStream पर toString बुला रहे हैं के बाद यह पहले से ही के माध्यम से पढ़ा है

दुर्भाग्य से जब इस विधि चल मैं इस संदेश को वापस मिलता है। आपको बाइट एरे से अपनी स्ट्रिंग बनाना होगा। सरल तरीके से सामग्री की स्ट्रिंग संस्करण प्राप्त करने के EntityUtils.toString(HttpEntity)

सटीक impl कैसा दिखेगा उपयोग करने के लिए है:

import org.apache.http.util.EntityUtils; 

public String fetchPage(String part){ 
    log.info("fetchPage STARTING"); 
    long start = System.currentTimeMillis(); 

    String reply; 

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(searchurl); 
    HttpResponse response; 
    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      return EntityUtils.toString(entity); 
     } 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return null; 
} 
+0

यदि मैं 'लम्बी elapsedTimeMillis = System.currentTimeMillis() - प्रारंभ करें; 'EntityUtils.toString (इकाई) लौटने से ठीक पहले;' प्रक्रिया के लिए विलुप्त समय लगभग 1300ms है, अगर मैं 'स्ट्रिंग परिणाम = EntityUtils.toString (इकाई); 'और फिर' वापसी परिणाम 'में लगभग 5500ms लगते हैं। क्या आप जानते हैं कि ऐसा क्यों है? –

+2

@ जैक: शायद क्योंकि क्लाइंट को उस बिंदु पर सर्वर भेज रहा है जहां आप इकाई प्राप्त करते हैं। स्ट्रिंग बनाना वास्तव में सर्वर को भेज रहे सभी सामग्री को पढ़ने की आवश्यकता है। – ColinD

+1

@ जैक मर्फी: EntityUtils.toString (इकाई) स्ट्रीम पढ़ रहा है। क्लाइंट को अभी तक सभी डेटा प्राप्त नहीं हुआ है। आप चाहते हैं कि उत्तरार्द्ध हस्तांतरण के समय को कैप्चर करे। – Joshua

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