HttpClient-response-handler gibt immer geschlossen-stream
Ich bin neu in der Java-Entwicklung, so bitte Geduld mit mir. Ich hoffe auch, ich bin nicht der champion von tl;dr :).
Ich bin mit HttpClient, um Anfragen über Http (duh!) und ich würde, bekommen Sie zu arbeiten, für ein einfaches servlet, erhält eine URL als query-string-parameter. Ich erkannte, dass mein code könnte etwas refactoring, also habe ich beschlossen, meine eigene HttpResponseHandler
, um den code zu bereinigen, damit es wiederverwendbar und verbessern die Behandlung von Ausnahmen.
Ich habe derzeit so etwas wie dieses:
public class HttpResponseHandler implements ResponseHandler<InputStream>{
public InputStream handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
int statusCode = response.getStatusLine().getStatusCode();
InputStream in = null;
if (statusCode != HttpStatus.SC_OK) {
throw new HttpResponseException(statusCode, null);
} else {
HttpEntity entity = response.getEntity();
if (entity != null) {
in = entity.getContent();
//This works
//for (int i;(i = in.read()) >= 0;) System.out.print((char)i);
}
}
return in;
}
}
Und in der Methode, wo ich die eigentliche Anfrage:
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(target);
ResponseHandler<InputStream> httpResponseHandler = new HttpResponseHandler();
try {
InputStream in = httpclient.execute(httpget, httpResponseHandler);
//This doesn't work
//for (int i;(i = in.read()) >= 0;) System.out.print((char)i);
return in;
} catch (HttpResponseException e) {
throw new HttpResponseException(e.getStatusCode(), null);
}
Das problem ist, dass der Eingabe-stream zurück von der hf geschlossen. Ich habe keine Ahnung warum, aber ich habe es mit den Abzügen in meinem code (und Nein, ich habe nicht verwendet Sie beide zur gleichen Zeit :). Während der ersten Druckereien, die andere gibt man einen geschlossenen stream-Fehler.
Brauche ich InputStreams
, weil alle meine anderen Methoden erwarten ein InputStream
und nicht ein String
. Auch ich möchte in der Lage sein, um Bilder (oder vielleicht auch andere Arten von Dateien), nicht nur text-Dateien.
Kann ich umgehen, ist das ziemlich einfach, indem Sie oben auf der response-handler (ich habe eine funktionierende Implementierung, der nicht mit es), aber ich bin ziemlich neugierig auf die folgenden:
- Warum tut es was es tut?
- Wie öffne ich den stream, wenn etwas es schließt?
- Was ist der richtige Weg, dies zu tun, eh :)?
Ich habe die docs und ich konnte nicht finden, dass irgendetwas nützliches zu diesem Thema. Speichern Sie ein bisschen Googeln, hier ist die Javadoc und hier ist die HttpClient tutorial (Abschnitt 1.1.8 - Response-Handler).
Dank,
Alex
InformationsquelleAutor Alex Ciminian | 2010-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es schließt den stream, weil ResponseHandler behandeln müssen, die gesamte Antwort. Auch wenn du einen stream öffnen, es sollte am Ende stream.
Den stream geschlossen ist, durch BasicHttpEntity ist consumeContent() aufrufen, um sicherzustellen, dass Sie nicht aus dem stream gelesen wieder.
In Ihrem Fall, Sie nicht wirklich brauchen, ResponseHandler.
Was hast du am Ende dabei @Alex Ciminian?
InformationsquelleAutor ZZ Coder
Das automatische Ressourcen-management, die aufgerufen wird, schließt den stream für Sie, um sicherzustellen, dass alle Ressourcen werden freigegeben und bereit für die nächste Aufgabe.
Wenn Sie möchten, strömen dann Sie beste Wette ist, kopieren Sie es in ein ByteArray und zurück ein ByteArrayInputStream, wenn der Inhalt ist relativ bescheiden.
Wenn der Inhalt ist nicht bescheiden, dann müssen Sie die Ressource-management Ihre selbst-und nicht die der ResponseHandler.
Abhängig von der Anzahl der gleichzeitigen verbindungen und die Größe des Arbeitsspeichers der Maschine. Heute mehrere Megabyte zu mehreren 10 Megabyte kann als "bescheiden". Es muss in den Speicher passt.
InformationsquelleAutor Peter Tillemans