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

时间:2017-04-30 15:24:27

标签: java bufferedreader urlconnection try-with-resources

如果此代码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?

1 个答案:

答案 0 :(得分:1)

所有Reader的关闭方法确实最终确实是关闭资源。 (请参阅the javadoc。)因此,如果您关闭BufferedReader,则不需要关闭InputStreamReaderInputStream。但是,如果您关闭它,则更清楚的是关闭所有资源并避免编译器警告。由于关闭Reader会关闭所有基础Reader和资源,关闭BufferedReader会关闭所有内容:

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

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