When using HttpURLConnection does the InputStream need to be closed if we do not 'get' and use it?
i.e. is this safe?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
// check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
// get stream and read from it
InputStream is = conn.getInputStream();
try {
// read from is
} finally {
is.close();
}
Secondly, is it safe to close an InputStream before all of it's content has been fully read?
Is there a risk of leaving the underlying socket in ESTABLISHED or even CLOSE_WAIT state?
According to http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html and OpenJDK source code.
(When keepAlive == true
)
If client called HttpURLConnection.getInputSteam().close()
, the later call to HttpURLConnection.disconnect()
will NOT close the Socket
. i.e. The Socket
is reused (cached)
If client does not call close()
, call disconnect()
will close the InputStream
and close the Socket
.
So in order to reuse the Socket
, just call InputStream.close()
. Do not call HttpURLConnection.disconnect()
.