Получив ответ от сервера (отправив http-запрос), я пытаюсь получить контент следующим образом:
HttpEntity entity = response.getEntity();
if (entity == null) {
...
}
String content;
try {
Reader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
content = IOUtils.toString(reader);
reader.close();
EntityUtils.consume(entity);
} catch (IOException e) {
...
}
Обязательно ли закрывать ридер (reader.close())? Или EntityUtils.consume(entity) хватит?




Это хорошая практика. При использовании ресурсов, допускающих «очистку», просто дерзайте. И самый простой способ - использовать try-with-resources:
try (InputStreamReader isr = new InputStreamReader(entity.getContent(), "UTF-8");
Reader reader = new BufferedReader()) {
content = IOUtils.toString(reader);
EntityUtils.consume(entity);
} catch (IOException e) {
...
}
Значение: язык Java уже дает вам средства, чтобы это происходило автоматически.
Да. И попробуй двигаться вперед. Java 6 похожа на: плохая идея :-)
я должен использовать объект также в разделе finally?
Вы можете использовать инструкцию try-with-resources:
try(Reader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"))) {
content = IOUtils.toString(reader);
EntityUtils.consume(entity);
} catch (IOException e) {
...
}
Что уже закрывает для вас читалку.
Для Java 6 вы должны использовать следующее:
Reader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
content = IOUtils.toString(reader);
EntityUtils.consume(entity);
} catch (IOException e) {
...
} finally {
if (reader != null){
try {
reader.close();
} catch(IOException e){
// can not be closed
}
}
}
Итак, если я использую Java 6, я должен закрыть читателя в разделе finally?
я должен использовать объект также в разделе finally?
@ ru51an зависит от того, что делает этот потребитель. Это в любом случае связано с чтением контента? Имеет ли он доступ к каким-либо ресурсам, таким как файлы, базы данных и так далее?
сущность используется только в той части кода, которую я опубликовал выше
Возможно, вы захотите вызвать этот EntityUtils.consume() за пределами try catch. Поскольку на самом деле это не место. Вы должны поместить наименьшее количество кода в блок try-catch, чтобы минимизировать возможные ошибки и сбои.
Поскольку OP уже использует IOUtils, блок finally может быть просто IOUtils.closeQuietly(reader);, который заботится о нулевой проверке и перехватывает вторичное исключение.
Итак, если я использую Java 6, я должен закрыть читателя в разделе finally?