Java 是否关闭HttpURLConnection而不关闭InputStream?
我有一个方法,它打开一个Java 是否关闭HttpURLConnection而不关闭InputStream?,java,sockets,http,inputstream,httpurlconnection,Java,Sockets,Http,Inputstream,Httpurlconnection,我有一个方法,它打开一个HttpURLConnection,然后从响应返回InputStream: // Callers are responsible for closing the returned input stream public InputStream get() { final URL url= new URL("http://example.com"); HttpURLConnection httpUrlConnection = (HttpU
HttpURLConnection
,然后从响应返回InputStream
:
// Callers are responsible for closing the returned input stream
public InputStream get()
{
final URL url= new URL("http://example.com");
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setRequestMethod("GET");
return httpUrlConnection.getInputStream();
// Don't close httpUrlConnection as that will close the returned input stream
// which the caller is responsible for closing.
}
我的问题是,我无法在此方法中关闭HttpURLConnection
,因为这将关闭基础InputStream
,此方法的调用方负责关闭此基础InputStream
。我无法控制打电话的人
HttpUrlConnection
没有关闭有多糟糕?它最终会关闭吗?或者我应该实施某种机制在一段时间后关闭它?或者复制/克隆InputStream
并返回副本,这将允许我关闭HttpURLConnection
?您不想让连接保持打开状态。这将带来资源泄漏的风险。我建议创建一个自定义的InputStream
实现,在流关闭时自动关闭连接:
public class HttpURLConnectionInputStream extends InputStream {
private HttpURLConnection connection;
private InputStream stream;
public HttpURLConnectionInputStream(HttpURLConnection connection) throws IOException {
this.connection = connection;
this.stream = connection.getInputStream();
}
@Override
public int read() throws IOException {
return stream.read();
}
@Override
public void close() throws IOException {
connection.disconnect();
}
}
然后将您的HttpURLConnection
传递给构造函数并返回自定义输入流:
public InputStream get() throws IOException {
final URL url = new URL("http://example.com");
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.connect();
return new HttpURLConnectionInputStream(httpUrlConnection);
}
谢谢,对于close方法,我们是否也应该先关闭输入流?例如@Override public void close()抛出IOException{inputStream.close();httpUrlConnection.disconnect();}@Rory我正在看JavaDoc,老实说,我不能肯定。两者都做当然没什么坏处。也许每个人都有自己的尝试捕捉?