连接 reader

Connection reader

有时我需要从给定的 url 中 return 一个 reader。在这种情况下,url 始终具有类似 http 或 https 的协议。我可以毫不费力地为此创建代码。

我想知道更好的做法是前者还是后者?

public Reader getContents (final URL url) {
    try {
        final Reader stream = new InputStreamReader(url.openConnection().getInputStream());
        final StringBuilder builder = new StringBuilder();

        int character;
        while ((character = stream.read()) != -1)
            builder.append((char)character);
        stream.close();
        return new StringReader(builder.toString());
    } catch (final IOException e) {
        e.printStackTrace();
    }
    return null;
}

此方法首先从 URL 内容创建一个字符串,然后 return 创建该字符串的 reader。在下面的代码中,我只是 returning InputStreamReader。我的担心之一是输入流不会被 reader 关闭,因为可能不会调用 Reader.close() 方法。我想知道更糟糕的是,不关闭连接输入流或关闭字符串输入流。

这是第二种方法,很简单:

public Reader getContents (final URL url) {
    try {
        return new InputStreamReader(url.openStream());
    } catch (final IOException e) {
        e.printStackTrace();
    }
    return null;
}

前者有意义,但有什么不同吗?

编辑 我已经按照接受的答案制作了方法:

public static Reader getContents (final URL url) {
    try {
        final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.connect();

        String charset = connection.getHeaderField("Content-Type");
        if (charset == null)
            charset = "UTF-8";
        else
            charset = charset.replaceAll(".*charset=(.*)", "");

        return new InputStreamReader(connection.getInputStream(), charset);
    } catch (final IOException e) {
        e.printStackTrace();
    }
    return null;
}

如果您打算将数据公开为 Reader(这比 String 更难使用),那么第二种方法会获得使用 [=10= 的好处] - 即限制消耗的内存量。

您还应该指定要使用的字符编码。您应该检查 http 响应内容类型以查看是否已指定字符集。如果不存在,则 http 默认值为 iso-8859-1,因此应该使用它,除非您调用的特定服务指定了不同的内容。您当前的方法使用平台的默认字符编码,可能无法保证正确。