Apache HttpClient en Java, les cours d'eau.toString = org.apache.http.conn.EofSensorInputStream
J'obtiens une page avec Apache HttpClient et je veux stocker la réponse du serveur http du corps dans une chaîne de caractères afin que je puisse les manipuler cette chaîne et l'imprimer pour la console.
Malheureusement, lors de l'exécution de cette méthode, j'obtiens ce message:
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
La fetchPage Classe:
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;
}
L'essentiel à comprendre ici est que
toString()
sur un InputStream
n'est pas une méthode pour lire son contenu comme un String
, mais plutôt pour obtenir une simple chaîne de la représentation de l'objet lui-même. En général (y compris dans ce cas) un InputStream
n'ont pas utile représentation de chaîne, il peut fournir, jusqu'à ce qu'il utilise la valeur par défaut Object.toString()
.OriginalL'auteur Dominik | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
Vous appelez les méthodes toString sur l'InputStream après qu'il a déjà lu. Vous devez créer votre chaîne à partir des tableaux d'octets. La manière la plus simple pour obtenir la Chaîne de version du contenu est d'utiliser le EntityUtils.toString(HttpEntity)
L'exacte impl ressemblerait à:
long elapsedTimeMillis = System.currentTimeMillis()-start;
juste avantreturn EntityUtils.toString(entity);
le temps écoulé pour la procédure est d'environ 1300ms, si j'arrête le temps aprèsString result = EntityUtils.toString(entity);
et puisreturn result
il faut environ 5500ms. Savez-vous pourquoi c'est?Probablement parce que le client n'a pas à avoir reçu toutes les données, le serveur envoie à l'endroit où vous obtenez l'entité. La création de la chaîne nécessite de lire tout le contenu, le serveur envoie.
Murphy: la EntityUtils.toString(entité) de la lecture du flux. Le client n'a pas reçu toutes les données encore. Vous voulez que le second de capturer la quantité de temps de transfert.
OriginalL'auteur Joshua