【问题标题】:Closing StreamReader关闭 StreamReader
【发布时间】:2018-11-10 09:28:21
【问题描述】:

从服务器获得响应后(通过发送 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)就够了?

【问题讨论】:

    标签: java http streamreader


    【解决方案1】:

    您可以使用try-with-resources-statement:

    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 取决于消费的作用。是否与阅读内容有关?它是否访问任何资源,如文件、数据库等?
    • 实体仅用于我上面发布的那部分代码
    • 您可能想在 try catch 之外调用 EntityUtils.consume()。因为它并不真正属于那里。您应该将最少的代码放入 try-catch 块中,以尽量减少可能的错误和失败
    【解决方案2】:

    这是一个很好的做法。当使用允许“清理”的资源时,就去做吧。 简单的方法是使用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 部分关闭阅读器吗?
    • 是的。并努力前进。 Java 6 就像:坏主意 :-)
    • 我是否也应该在 finally 部分消费实体?
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多