Apache-HttpClient-Java, instream.toString = org.apache.http.conn.EofSensorInputStream
Bin ich Immer eine Seite mit Apache HttpClient und ich wollen speichern Sie die server-Antwort den http-Körper in einem string, so kann ich dann diese Zeichenfolge ändern, und drucken Sie es an die Konsole.
Leider beim ausführen dieser Methode bekomme ich diese Meldung zurück:
17:52:01,862 INFO Driver:53 - fetchPage STARTING
17:52:07,580 INFO Driver:73 - fetchPage ENDING, took 5716
org.apache.http.conn.EofSensorInputStream@5e0eb724
Den fetchPage Klasse:
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;
}
- Die wichtige Sache zu verstehen ist hier, dass
toString()
auf eineInputStream
ist nicht eine Methode, um den Inhalt zu Lesen alsString
, sondern um eine einfache string-Darstellung des Objekts selbst. In der Regel (auch in diesem Fall) eineInputStream
nicht eine sinnvolle string-Darstellung, die es geben kann, so es benutzt nur die Standard -Object.toString()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind dem Aufruf der toString-Methode auf den InputStream, nachdem es bereits durchgelesen. Sie müssen erstellen Sie Ihre string aus dem byte-arrays. Der einfachere Weg ist, um die String-version der Inhalte, ist die Verwendung der EntityUtils.toString(HttpEntity)
Den genauen impl würde wie folgt Aussehen:
long elapsedTimeMillis = System.currentTimeMillis()-start;
Recht vorreturn EntityUtils.toString(entity);
die verstrichene Zeit für das Verfahren über 1300ms, wenn ich stop die Zeit nachString result = EntityUtils.toString(entity);
und dannreturn result
es dauert etwa 5500ms. Wissen Sie, warum das so ist?