При использовании HttpURLConnection необходимо ли закрывать InputStream, если мы не «получаем» и не используем его?Безопасное использование HttpURLConnection
i.e. это сейф?
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();
}
Во-вторых, это безопасно закрыть InputStream , прежде чем все это содержание было полностью прочитать?
Есть ли риск оставить базовое гнездо в состоянии ESTABLISHED или даже CLOSE_WAIT?
Очень интересно. Этот вопрос на самом деле является фоном для проблемы, с которой я сталкиваюсь, когда я вижу LOTS из сокетов CLOSE_WAIT для одного и того же IP-адреса, но из-за кэширования (я не вызываю URLConnection.disconnect() явно). Я ожидаю, что будет только один, который следует использовать повторно. – Joel
@Joel: вызывая 'HttpUrlConnection.disconnect()' базовый tcp-сокет закрыт. Закрывая входной поток, базовый tcp-сокет объединяется для последующего повторного использования.Единственное предостережение состоит в том, что весь ответ (ИЛИ весь ответ об ошибке) должен быть прочитан из входного потока, чтобы кеширование tcp было кэшировано. Это всегда было рекомендовано, несмотря на то, что вам действительно нужны все данные из потока. Проверьте сообщение в своем ответе – Cratylus
Что делать, если вы не читаете ЛЮБОЙ данных, как в моем первом примере? Я предполагаю, что вам все равно нужно закрыть IS, но он все равно не будет кэшироваться, если данные не будут прочитаны, но все равно закрыто. – Joel