JAVA中对于各种流比如文件流,网络流等的操作都需要有释放的环节,否则可能会导致资源泄露,资源的持续消耗会导致系统的崩溃。JAVA中做资源销毁的形式有三个阶段的演变,按照JDK的版本的演进主要分为JDK7之前,JDK7和JDK9,网上也有总结,主要是写法上的不同,但是深层的意义当然是为了避免资源的泄露,以及更好的复用我们的资源。下面就是三个不同的方式。
第一种是JDK7之前的,这种老程序员知道写了很多代码,而且很丑陋,尤其是用的多了,就忘记关闭的,还有关闭顺序的问题,相当痛苦。后期有些库的封装,调用方法会帮助销毁资源的,但是代码还是有冗余。
FileOutputStreamfileOutputStream=null; try{ fileOutputStream=newFileOutputStream(""); fileOutputStream.write(0); }catch(IOExceptione){ e.printStackTrace(); }finally{ if(fileOutputStream!=null){ try { fileOutputStream.close(); } catch (IOExceptione) { thrownewRuntimeException(e); } } }
第二种是JDK7中的写法,这种写法简单多了,这种方式至少避免了资源的泄露,finally里的销毁代码去掉了看起来舒服很多
try(FileOutputStreamfileOutputStream=newFileOutputStream("")) { fileOutputStream.write(0); }catch(Exceptione){ e.printStackTrace(); }
第三种是JDK9引入的增强写法,咋乍一看代码比JDK7还多了呢,这里面的外围的异常是判断资源为空的问题,可以throw出来,给业务层判断。看网上有评论说JDK9的增强try-with-resources只是语法糖,没啥意义,对于这点本人不认同。何为增强,仅仅是语法的变通?真实的意义官网的release note中也有提到"如果已将资源作为最终变量或实际上是最终变量,则可以在 try-with-resources 语句中使用该变量,而无需声明新变量。“有效最终”变量是其值在初始化后永远不会更改的变量。"这里其实是资源复用的问题,这里的资源只是资源的关闭,不是资源对象本身的销毁,有时候我们需要对资源对象做状态判断或者复用做其他的业务逻辑,此时JDK9的增强写法意义重大,如果没有新的写法,JDK7里的实现是很丑陋的。
try { FileOutputStreamfileOutputStream=newFileOutputStream(""); try (fileOutputStream) { fileOutputStream.write(0); } catch (Exceptione) { e.printStackTrace(); } }catch (FileNotFoundExceptionfnfe){ fnfe.printStackTrace(); }