连接阅读器

时间:2015-01-04 14:18:31

标签: java io connection

我有机会从一个给定的网址返回一个读者。在这种情况下,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内容创建一个String,然后返回该String的读者。在下面的代码中,我只是返回InputStreamReader。我担心的一个问题是输入流不会被读取器关闭,因为可能不会调用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=(.*)", "$1");

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

1 个答案:

答案 0 :(得分:0)

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

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