我有机会从一个给定的网址返回一个读者。在这种情况下,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;
}
答案 0 :(得分:0)
如果您打算将数据公开为Reader
(这比String
更难消费),那么第二种方法可以获得使用Reader
的好处 - 即限制消耗的内存量。
您还应指定要使用的字符编码。您应该检查http响应内容类型以查看是否已指定charset。如果不存在,则http默认为iso-8859-1,因此除非您调用的特定服务指定了不同的内容,否则应使用它。您当前的方法使用平台的默认字符编码,这可能无法保证是正确的。