gpt4 book ai didi

java - 在 Java 8 中正确使用 URLConnection 和 try-with-resources

转载 作者:行者123 更新时间:2023-11-30 06:45:48 24 4
gpt4 key购买 nike

如果此代码 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,则实际上不需要关闭BufferedReaderInputStreamReader。但是,更清楚的是,您将关闭所有资源,并避免编译器警告(如果您无论如何关闭它)。由于关闭 Reader 会关闭所有底层 Reader 和资源,因此关闭 BufferedReader 将关闭所有内容:

try (BufferedReader rd = new BufferedReader(new InputStreamReader(
connection.getInputStream()))) {
return new JSONObject(readAll(rd));
}

因此,您只需在 try-with-resources 中声明顶级读取器即可。

关于java - 在 Java 8 中正确使用 URLConnection 和 try-with-resources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com