如何关闭流和对象文件

tech2024-10-18  14

最近在项目中,代码质量整改时做的,full gc扫描,回收不用的资源文件。总结了一下和jdk版本有关

版本是jdk1.6 (如果有多个,最先创建的最后关,最后创建的最先关) 在 JDK 7 之前,你一定要牢记在 finally 中执行 close 以释放资源 https://blog.csdn.net/guxianyang/article/details/78304142 原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭。 InputStream in = null; try { in = acquireStream(); ... } finally { if (in != null) in.close(); }

在上述代码中,流的关闭是放在try中的,但是我们都知道流资源的关闭尽量要放在finally块中,因为如果try中代码执行失败,流没有被正确关闭就造成资源浪费。 首先关闭资源放在try块里一定会有问题:资源可能不被关闭。 所以资源的关闭应该放在finally里,这没有什么疑问。 至于finally块里close资源会额外引入IOE,这也是无法避免的。 目前(就我见到过的)绝大多数代码里,捕获IOE后,最多打一条log,更多的是noop,即no operations,do nothing。 close的时候IOE发生的几率很小,它应该属于一种操作系统层面的error,选择忽略它是正确的选择,毕竟你的系统不能因为一个资源关闭错误而停止运行。况且,如果你硬要捕获这个IOE,那能做些什么呢

2.版本是jdk 1.7 JDK 7 中的 try-with-resources 介绍 try-with-resources 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。 https://www.cnblogs.com/hk-zsg/p/11557431.html 代码: 例如,我们自定义一个资源类

public class Demo { public static void main(String[] args) { try(Resource res = new Resource()) { // try res.doSome(); } catch(Exception ex) { ex.printStackTrace(); } } } class Resource implements AutoCloseable { // 实现接口AutoCloseable void doSome() { System.out.println("do something"); } @Override public void close() throws Exception { System.out.println("resource is closed"); } }

执行输出如下:

do something resource is closed

步骤1定义接口实现AutoCloseable接口 步骤2,把资源放在try里面

3 try-with-resources 在 JDK 9 中的改进

最新回复(0)