用 Java .url 库自带的轮子,追求最佳实践的话,需要在 finally 中检查并手动释放资源么?

2019-07-26 11:48:55 +08:00
 shayuvpn0001

事情是这样的,维护一个老项目,要用到 Jython。

在 Jython 中请求网络连接,我尝试过 urllib2, httplib,碰到了一个这样的问题: 如果是 Jython 脚本第一次发送 GET 请求,是能正确获取到响应的内容( JSON 文件),一旦停止 Jython 脚本,再次启动,就会报错。网上搜了一下,stackoverflow 上面有人解释是 urllib2, httplib 使用了 Netty 库,这个问题是 Netty 造成的,推荐解决方案是用 Requests 库。
参考: https://stackoverflow.com/questions/32239955/why-does-this-jython-loop-fail-after-a-single-run

由于不想引入太多的依赖增加维护成本,我没有使用 Requests 库,直接用 java.url 库实现了一个版本。上面的问题已经通过这个方式解决。

当前的问题是,在使用 Java 自带的 java.url 库的时候,我看 stackoverflow 上有人说在 finally 部分对打开的连接和 InputStream 进行检查,如果可以就进行回收。(详见下面代码的 finally 部分)我想了解一下在不用框架直接用库的情况下这种写法是值得推荐的还是必须强制的?这样的操作适用于 Jython 么?
参考: https://stackoverflow.com/questions/9150200/closing-urlconnection-and-inputstream-correctly

HttpURLConnection conn = null;
InputStream is = null;
try {
    URL url = new URL("http://example.com");

    // (set connection and read timeouts on the connection)
    conn = (HttpURLConnection)url.openConnection();

    is = new BufferedInputStream(conn.getInputStream());

    doSomethingWithInputStream(is);

} catch (Exception ex) {
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException e) {
        }
    }
    if (conn != null) {
        conn.disconnect();
    }
}
1308 次点击
所在节点    程序员
4 条回复
LeeSeoung
2019-07-26 11:54:52 +08:00
可以了解下 try(InputStream is = xxxx)这种形式的写法
wc951
2019-07-26 13:19:35 +08:00
jdk7 以上就有 try-with-resource 语法糖了
shayuvpn0001
2019-07-26 14:12:43 +08:00
@LeeSeoung
@wc951

谢谢回复,如果不用语法糖,按上面这种写法会不会对系统资源回收好点?主要是这个 GET 请求会 7×24 一直跑,如果上面不执行 is.close 和 conn.disconnect,GC 到时候应该会自动回收吧,显式的手动回收一下是不是好点?
skypyb
2019-07-26 14:15:08 +08:00
连接和流最好都是手动回收,你这样写没啥问题啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX