jdk1.7之后java不需要自己关闭io流了
前言
在jdk1.7以前,io的操作都是要关流的,而经常有些码农就会忘记关流(比如说我),从而造成资源的浪费,降低系统性能。但值的高兴的是,在jdk1.7以后就不用关流了,流会自动关闭,,这样一来,我们就不用担心关流的问题了。就在刚出版的jdk1.9中又对jdk1.7中的方式又做新的更新,先不急了解新写法,我们先从jdk1.7之前出现,看看之前关流的做法是怎样的。
tip:如果想使用这种糖语法关流,就必须实现AutoColseable接口,才可以自动关流
AutoColseable接口源码:
public interface AutoCloseable { void close() throws Exception; }
JDK1.7之前关流方式
jdk1.7之前,在finally块(并不一定要在finally块中)中执行close()方法,关闭流并释放与该流关联的所有系统资源。这样一来,每打开一个连接,就要关一次连接。
public static void testBuffered(File file) throws IOException { BufferedInputStream bis = null; try { bis = new BufferedInputStream(new FileInputStream(file)); byte[] b = new byte[bis.available()]; bis.read(b); System.out.println("使用缓冲字节输入流读取到的结果如下:"+new String(b)); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { //关闭流 bis.close(); }
}
或者使用工具包,稍微简洁一些:
InputStream is=null; InputStreamReader isr=null; BufferedReader read=null; try { is = new FileInputStream(new File("")); isr = new InputStreamReader(is); read = new BufferedReader(isr); String s = read.readLine(); } finally { IOUtils.closeQuietly(read,isr,is); }
JDK1.7新语法
在JDK1.7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了这一功能。简单的demo我也写了一个,放在下面...
public class Java7 { public static void main(String[] args) { File file = new File("D:"+File.separator+"test.txt"); try(FileInputStream fis = new FileInputStream(file);){ byte[] b = new byte[fis.available()]; fis.read(b); System.out.println("文件读取内容如下:"+new String(b)); } catch (IOException e) { e.printStackTrace(); } } }
只要把需要关流的操作写在try()中就可以不用关流,不需要关流的操作(准确来说是没有实现AtuoColseable接口的类),不能写在try()中,否则报错。
JDK1.9新语法
JDK9发布后,又简化了try-with-resources语句的用法。try()里面可以是一个变量,但必须是final的或者等同final才行。如下面的mis,mos定义成局部变量可以不用final,局部变量可以等同于final,但定义成成员变量就必须是用final修饰的,不然会编译错误。
MyInputStream mis = new MyInputStream(); MyOutputStream mos = new MyOutputStream(); try (mis; mos) { mis.read("1.9"); mos.write("1.9"); } catch (Exception e) { e.printStackTrace(); }
简略的谈一下个人对9的语法的感觉,总体来来说,比7的版本的中的语法看的让人更舒服,然后就是没有什么太大的区别了。说白了这些语法糖,表面上我们没有手动关流,其实在运行期间,还是调用close()方法进行关流的,只是这一步不用我们去做了。
总结
闲话不多扯,做个总结,总之要想实现自动关流,还是想看连接类有没有实现AutoColseable这个接口,具体可以查看源码,这里不作详细解释。
摘自:https://zhuanlan.zhihu.com/p/44315729
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-04-27 mysql 使用order by String 的巨坑 注意事项