Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否关闭HttpURLConnection而不关闭InputStream?_Java_Sockets_Http_Inputstream_Httpurlconnection - Fatal编程技术网

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,老实说,我不能肯定。两者都做当然没什么坏处。也许每个人都有自己的尝试捕捉?