2011-06-02 20 views
5

Apache HttpClient ile bir sayfa alıyorum ve sunucu yanıtının http gövdesini bir dizeye saklamak istiyorum, böylece bu dizeyi değiştirebilirim ve konsola yazdırın.Java'da Apache HttpClient, 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 Sınıf:

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

burada anlamak için anahtar teknoloji olan, 'inputStream üzerine toString()' 'o ', içeriğini bir' String' olarak okumak için değil, nesnenin kendisinin basit bir dize temsili olmasını sağlamak için bir yöntem değildir. Tipik olarak (bu durumda dahil) bir 'InputStream', sağlayabileceği kullanışlı bir dize temsile sahip değildir, bu yüzden sadece varsayılan' Object.toString() 'kullanır. – ColinD

cevap

10

zaten okumak sonra size InputStream üzerinde toString aradığınız bu yöntemi çalıştırırken

Ne yazık ki tekrar bu mesajı alıyorum. Dizginizi bayt dizilerinden oluşturmanız gerekir. içeriğin dize sürümünü almak için basit bir yolu kesin impl gibi görünecektir EntityUtils.toString(HttpEntity)

kullanmaktır:

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

Eğer 'long elapsedTimeMillis = System.currentTimeMillis() - eklerseniz, '' EntityUtils.toString (varlık)' i döndürmeden önce; '' dize sonucu = '' zamanından sonra durursam, işlemin geçen süre yaklaşık 1300 ms'dir. EntityUtils.toString (varlık); 've sonra' sonuç döndürür 'yaklaşık 5500 ms sürer. Bunun neden olduğunu biliyor musun? –

+2

@Jack: Muhtemelen, istemcinin sunucuyu vardığı noktada gönderdiği tüm verileri alması gerekmediğinden. Dizenin oluşturulması, sunucunun gönderdiği tüm içeriği gerçekten okumayı gerektirir. – ColinD

+1

@Jack Murphy: EntityUtils.toString (varlık) akışı okuyor. Müşteri henüz tüm verileri almadı. İkincisinin transfer zamanını yakalamasını isteyeceksiniz. – Joshua