Al utilizar HttpURLConnection, ¿se debe cerrar el InputStream si no lo'gramos 'y lo usamos?Uso seguro de HttpURLConnection
i.e. ¿esto es seguro?
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();
}
En segundo lugar, ¿es seguro para cerrar un InputStream antes de que todo su contenido ha sido leído completamente?
¿Existe el riesgo de dejar el socket subyacente en estado ESTABLISHED o incluso CLOSE_WAIT?
Muy interesante. Esta pregunta es en realidad de fondo para un problema que tengo en el que veo MUCHOS de sockets CLOSE_WAIT en la misma IP, pero debido al almacenamiento en caché (no llamo URLConnection.disconnect() explícitamente) espero que haya solo uno, que debe ser reutilizado – Joel
@Joel: Al llamar al 'HttpUrlConnection.disconnect()', se cierra el zócalo tcp subyacente. Al cerrar el flujo de entrada, el zócalo tcp subyacente se agrupa para su reutilización posterior.La única advertencia es que toda la respuesta (O toda la respuesta de error) debe leerse desde la secuencia de entrada para que la conexión tcp se almacene en caché. Esto siempre se ha asesorado independientemente de que realmente necesite toda la información de la transmisión. Revise la publicación en mi respuesta – Cratylus
¿Qué sucede si no lee CUALQUIER dato, como en mi primer ejemplo? Supongo que todavía necesita cerrar el IS, pero ¿no se almacenará en caché si no se leen los datos, pero sigue siendo cerrado. – Joel