Java 8 中正确使用 URLConnection 和 try-with-resources
Proper use of URLConnection and try-with-resources in Java 8
如果此代码 100% 避免内存泄漏或保持套接字打开,我不是 100%:
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
URLConnection connection = new URL(url).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(8000);
try (InputStream is = connection.getInputStream()) {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
}
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
我是否也需要将 "BufferedReader rd" 放入内部第二次尝试中,或者它会过时吗?如果发生读取或连接超时,并且尝试尚未完成怎么办?顺便说一句,为什么 URLConnection 没有 disconnect() 或 close() 函数?
Reader
的 close 方法最终真正做的是关闭资源。 (参见 the javadoc。)因此,如果您已经关闭了 InputStream
,那么您实际上不需要关闭 BufferedReader
或 InputStreamReader
。但是,更清楚的是您正在关闭所有资源,并且如果您关闭它,则可以避免编译器警告。由于关闭 Reader
会关闭所有基础 Reader
和资源,因此关闭 BufferedReader
将关闭所有内容:
try (BufferedReader rd = new BufferedReader(new InputStreamReader(
connection.getInputStream()))) {
return new JSONObject(readAll(rd));
}
因此您只需在 try-with-resources 中声明顶级 reader。
如果此代码 100% 避免内存泄漏或保持套接字打开,我不是 100%:
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
URLConnection connection = new URL(url).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(8000);
try (InputStream is = connection.getInputStream()) {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
}
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
我是否也需要将 "BufferedReader rd" 放入内部第二次尝试中,或者它会过时吗?如果发生读取或连接超时,并且尝试尚未完成怎么办?顺便说一句,为什么 URLConnection 没有 disconnect() 或 close() 函数?
Reader
的 close 方法最终真正做的是关闭资源。 (参见 the javadoc。)因此,如果您已经关闭了 InputStream
,那么您实际上不需要关闭 BufferedReader
或 InputStreamReader
。但是,更清楚的是您正在关闭所有资源,并且如果您关闭它,则可以避免编译器警告。由于关闭 Reader
会关闭所有基础 Reader
和资源,因此关闭 BufferedReader
将关闭所有内容:
try (BufferedReader rd = new BufferedReader(new InputStreamReader(
connection.getInputStream()))) {
return new JSONObject(readAll(rd));
}
因此您只需在 try-with-resources 中声明顶级 reader。