JAVA资源销毁的方式的演变

简介: 从try-catch-finally到try-with-resources

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();
}
目录
相关文章
|
16天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
41 9
|
26天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
51 2
|
16天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
35 11
|
3月前
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
43 2
|
4月前
|
监控 算法 Java
深入理解Java虚拟机:垃圾收集机制的演变与最佳实践
【7月更文挑战第14天】本文将带领读者穿梭于JVM的心脏——垃圾收集器,探索其设计哲学、实现原理和性能调优。我们将从早期简单的收集算法出发,逐步深入到现代高效的垃圾收集策略,并分享一些实用的调优技巧,帮助开发者在编写和维护Java应用时做出明智的决策。
48 3
|
4月前
|
存储 Java 编译器
Java面试题:描述方法区(Method Area)的作用以及它在JVM中的演变(从永久代到元空间)
Java面试题:描述方法区(Method Area)的作用以及它在JVM中的演变(从永久代到元空间)
56 3
|
4月前
|
缓存 前端开发 Java
在Java项目中实现跨域资源共享(CORS)
在Java项目中实现跨域资源共享(CORS)
|
5月前
|
Java
在Java中,死锁是指两个或多个线程互相等待对方释放资源,从而导致所有线程都无法继续执行的情况。
【6月更文挑战第24天】在Java并发中,死锁是多线程互相等待资源导致的僵局。避免死锁的关键策略包括:防止锁嵌套,设定固定的加锁顺序,使用`tryLock`带超时,避免无限等待,减少锁的持有时间,利用高级同步工具如`java.util.concurrent`,以及实施死锁检测和恢复机制。通过这些方法,可以提升程序的并发安全性。
43 1
|
4月前
|
Java Go 调度
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
Java演进问题之协程和线程在资源占用和切换速度上不同如何解决
|
4月前
|
Java Docker 容器
Java演进问题之Java的资源占用如何解决
Java演进问题之Java的资源占用如何解决