如果此代码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()函数btw?
答案 0 :(得分:1)
所有Reader
的关闭方法确实最终确实是关闭资源。 (请参阅the javadoc。)因此,如果您关闭BufferedReader
,则不需要关闭InputStreamReader
或InputStream
。但是,如果您关闭它,则更清楚的是关闭所有资源并避免编译器警告。由于关闭Reader
会关闭所有基础Reader
和资源,关闭BufferedReader
会关闭所有内容:
try (BufferedReader rd = new BufferedReader(new InputStreamReader(
connection.getInputStream()))) {
return new JSONObject(readAll(rd));
}
因此,您只需在try-with-resources中声明顶级阅读器。