我是Java开发新手,请耐心等待。另外,我希望我不是tl;dr的冠军:)。HttpClient响应处理程序总是返回关闭流
我使用HttpClient来通过Http(duh!)发出请求,并且我将它用于接收URL作为查询字符串参数的简单servlet。我意识到我的代码可以使用一些重构,所以我决定自己创建HttpResponseHandler
,以清理代码,使其可重用并改进异常处理。
我现在有这样的事情:
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;
}
}
而且在我使实际请求的方法:
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);
}
的问题是,输入流从处理程序返回的是关闭。我不知道为什么,但我已经用我的代码中的打印件进行了检查(不,我没有同时使用它们:)。当第一个印刷品工作时,另一个印刷品产生闭合流错误。
我需要InputStreams
,因为我所有的其他方法预计InputStream
而不是String
。另外,我希望能够检索图像(或其他类型的文件),而不仅仅是文本文件。
我可以解决此很容易地通过在响应处理器放弃了(我有一个工作实现不使用它),但我很好奇以下:
- 为什么它做它做什么?
- 如何打开流,如果东西关闭它?
- 什么是正确的方式来做到这一点,无论如何:)?
我检查了文档,找不到有关此问题的任何有用信息。为了节省你一些谷歌搜索,这里是Javadoc和这里的HttpClient tutorial(第1.1.8节 - 响应处理程序)。
谢谢,
亚历
谢谢。我处于一种愤怒的螺旋状中,发现这一切都是有道理的。 – 2012-05-17 16:38:31
你最终做了什么@Alex Ciminian? – 2013-12-26 21:09:21