V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayuvpn0001
V2EX  ›  程序员

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

  •  
  •   shayuvpn0001 · 2019-07-26 11:48:55 +08:00 · 1375 次点击
    这是一个创建于 1946 天前的主题,其中的信息可能已经有所发展或是发生改变。

    事情是这样的,维护一个老项目,要用到 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();
        }
    }
    
    4 条回复    2019-07-26 14:15:08 +08:00
    LeeSeoung
        1
    LeeSeoung  
       2019-07-26 11:54:52 +08:00   ❤️ 1
    可以了解下 try(InputStream is = xxxx)这种形式的写法
    wc951
        2
    wc951  
       2019-07-26 13:19:35 +08:00 via Android
    jdk7 以上就有 try-with-resource 语法糖了
    shayuvpn0001
        3
    shayuvpn0001  
    OP
       2019-07-26 14:12:43 +08:00
    @LeeSeoung
    @wc951

    谢谢回复,如果不用语法糖,按上面这种写法会不会对系统资源回收好点?主要是这个 GET 请求会 7×24 一直跑,如果上面不执行 is.close 和 conn.disconnect,GC 到时候应该会自动回收吧,显式的手动回收一下是不是好点?
    skypyb
        4
    skypyb  
       2019-07-26 14:15:08 +08:00   ❤️ 1
    连接和流最好都是手动回收,你这样写没啥问题啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:30 · PVG 17:30 · LAX 01:30 · JFK 04:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.