连接 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,因此应该使用它,除非您调用的特定服务指定了不同的内容。您当前的方法使用平台的默认字符编码,可能无法保证正确。
有时我需要从给定的 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,因此应该使用它,除非您调用的特定服务指定了不同的内容。您当前的方法使用平台的默认字符编码,可能无法保证正确。