当前位置: 首页 > 面试题库 >

Java资源关闭

文国发
2023-03-14
问题内容

我正在编写一个连接到网站并从中读取一行的应用程序。我这样做是这样的:

try{
        URLConnection connection = new URL("www.example.com").openConnection();
        BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String response = rd.readLine();
        rd.close();
    }catch (Exception e) {
        //exception handling
    }

好吗?我的意思是,我在最后一行关闭了BufferedReader,但没有关闭InputStreamReader。我是否应该从connection.getInputStream创建一个独立的InputStreamReader,并从独立的InputStreamReader创建一个BufferedReader,而不是关闭所有两个阅读器?我认为最好将close方法放置在finally块中,如下所示:

InputStreamReader isr = null;
BufferedReader br = null;
try{
    URLConnection connection = new URL("www.example.com").openConnection();
    isr = new InputStreamReader(connection.getInputStream());
    br = new BufferedReader(isr);
    String response = br.readLine();
}catch (Exception e) {
    //exception handling
}finally{
    br.close();
    isr.close();
}

但这很丑陋,因为关闭方法会引发异常,所以我必须处理或引发异常。

哪种解决方案更好?或最佳解决方案是什么?


问题答案:

Java中资源获取和发布的一般习惯用法是:

final Resource resource = acquire();
try {
    use(resource);
} finally {
    resource.release();
}

注意:

  • try应该立即跟随习得。这意味着您不能将其包装在装饰器中并保持安全性(删除空格或将内容放在一行上都无济于事:)。
  • 每个发行一个finally,否则将不会异常安全。
  • 避免null使用final。否则,您将拥有凌乱的代码和潜在的NPE。
  • 通常,除非装饰器具有与之关联的其他资源,否则无需将其关闭。但是,通常需要刷新输出,但在例外情况下应避免这种情况。
  • 异常应该传递给调用者,或者从周围的try块中捕获(Java会使您误入歧途)。


 类似资料:
  • 随着 Jekyll 被更广泛的使用,一系列的教程、框架、扩展、示例和其他各种有用的资源也相继出现。下面列出了一些最流行的 Jekyll 资源合辑的链接。 Jekyll 提示和技巧,以及示例 与 GitHub Pages 集成的技巧 重用代码并保持文档同步至最新的示例。 使用 Simple Form 来集成一个简单的联系表单 JekyllBootstrap.com 提供了详细的解释,例子和辅助代码让

  • Windows 命令行界面 cmder 的官方网站 宁皓网《命令行》视频课程 宁皓网《我的工作流程:Windows》视频课程里的命令行 宁皓网《我的工作流程》视频课程里的终端

  • Atlassian:Learn Git Git 远程服务 Github,国外服务商,公开仓库免费,私有仓库收费 Coding.net,国内服务商,提供免费的公开与私有仓库 阿里云 Git,国内服务商,提供免费的公开与私有仓库 Atlassian,国外服务商,提供免费的公开与私有仓库

  • Digital Ocean:How To Use Rsync to Sync Local and Remote Directories on a VPS Tecmint:10 Practical Examples of Rsync Command in Linux

  • 相关资料: MDN 影子DOM(Shadow DOM) Web Components Shadow DOM v1:独立的网络组件

  • 我正在编写一个程序,希望控制台输出用户输入的数字的剩余部分。但是,每次我编译代码时,控制台都会打印出来,我得到以下控制台错误: 我不确定控制台所说的“资源泄漏”是什么意思。我在几个不同的地方查找过它(包括API和其他堆栈溢出问题),我不确定为什么没有打印到控制台。我正在使用DrJava程序,以防有人想知道。 这里是我的代码供参考: