文章目录

  • 简介
  • IO关闭的问题
  • 使用try with resource
  • try with resource的原理
  • 自定义resource
  • 总结

简介

小师妹是个java初学者,最近正在学习使用java IO,作为大师兄的我自然要给她最给力的支持了。一起来看看她都遇到了什么问题和问题是怎么被解决的吧。

IO关闭的问题

这一天,小师妹一脸郁闷的问我:F师兄,我学Java IO也有好多天了,最近写了一个例子,读取一个文件没有问题,但是读取很多个文件就会告诉我:”Can’t open so many files“,能帮我看看是什么问题吗?

更多内容请访问www.flydean.com

小师妹的要求当然不能拒绝,我立马响应:可能打开文件太多了吧,教你两个命令,查看最大文件打开限制。

一个命令是 ulimit -a

第二个命令是

ulimit -n
256

看起来是你的最大文件限制太小了,只有256个,调大一点就可以了。

小师妹却说:不对呀F师兄,我读文件都是一个一个读的,没有同时开这么多文件哟。

好吧,看下你写的代码吧:

BufferedReader bufferedReader = null;try {String line;bufferedReader = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"));while ((line = bufferedReader.readLine()) != null) {log.info(line);}} catch (IOException e) {log.error(e.getMessage(), e);}

看完代码,问题找到了,小师妹,你的IO没有关闭,应该在使用之后,在finally里面把你的reader关闭。

下面这段代码就行了:

BufferedReader bufferedReader = null;try {String line;bufferedReader = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"));while ((line = bufferedReader.readLine()) != null) {log.info(line);}} catch (IOException e) {log.error(e.getMessage(), e);} finally {try {if (bufferedReader != null){bufferedReader.close();}} catch (IOException ex) {log.error(ex.getMessage(), ex);}}

小师妹道了一声谢,默默的去改代码了。

使用try with resource

过了半个小时 ,小师妹又来找我了,F师兄,现在每段代码都要手动添加finally,实在是太麻烦了,很多时候我又怕忘记关闭IO了,导致程序出现无法预料的异常。你也知道我这人从来就怕麻烦,有没有什么简单的办法,可以解决这个问题呢?

那么小师妹你用的JDK版本是多少?

小师妹不好意思的说:虽然最新的JDK已经到14了,我还是用的JDK8.

JDK8就够了,其实从JDK7开始,Java引入了try with resource的新功能,你把使用过后要关闭的resource放到try里面,JVM会帮你自动close的,是不是很方便,来看下面这段代码:

try (BufferedReader br = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"))){String sCurrentLine;while ((sCurrentLine = br.readLine()) != null){log.info(sCurrentLine);}} catch (IOException e) {log.error(e.getMessage(), e);}

try with resource的原理

太棒了,小师妹非常开心,然后又开始问我了:F师兄,什么是resource呀?为什么放到try里面就可以不用自己close了?

resource就是资源,可以打开个关闭,我们可以把实现了java.lang.AutoCloseable接口的类都叫做resource。

先看下AutoCloseable的定义:

public interface AutoCloseable {void close() throws Exception;
}

AutoCloseable定义了一个close()方法,当我们在try with resource中打开了AutoCloseable的资源,那么当try block执行结束的时候,JVM会自动调用这个close()方法来关闭资源。

我们看下上面的BufferedReader中close方法是怎么实现的:

public void close() throws IOException {synchronized (lock) {if (in == null)return;in.close();in = null;cb = null;}
}

自定义resource

小师妹恍然大悟:F师兄,那么我们是不是可以实现AutoCloseable来创建自己的resource呢?

当然可以了,我们举个例子,比如给你解答完这个问题,我就要去吃饭了,我们定义这样一个resource类:

public class CustResource implements AutoCloseable {public void helpSister(){log.info("帮助小师妹解决问题!");}@Overridepublic void close() throws Exception {log.info("解决完问题,赶紧去吃饭!");}public static void main(String[] args) throws Exception {try( CustResource custResource= new CustResource()){custResource.helpSister();}}
}

运行输出结果:

[main] INFO com.flydean.CustResource - 帮助小师妹解决问题!
[main] INFO com.flydean.CustResource - 解决完问题,赶紧去吃饭!

总结

最后,小师妹的问题解决了,我也可以按时吃饭了。

本文的例子https://github.com/ddean2009/learn-java-io-nio

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/io-try-with/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

小师妹学JavaIO之:try with和它的底层原理相关推荐

  1. 小师妹学JavaIO之:Buffer和Buff

    文章目录 简介 Buffer是什么 Buffer进阶 创建Buffer Direct VS non-Direct Buffer的日常操作 向Buffer写数据 从Buffer读数据 rewind Bu ...

  2. java buff_小师妹学JavaIO之:Buffer和Buff

    简介 小师妹在学习NIO的路上越走越远,唯一能够帮到她的就是在她需要的时候给她以全力的支持.什么都不说了,今天介绍的是NIO的基础Buffer.老铁给我上个Buff. Buffer是什么 小师妹:F师 ...

  3. 小师妹学JavaIO之:用Selector来发好人卡

    文章目录 简介 Selector介绍 创建Selector 注册Selector到Channel中 SelectionKey selector 和 SelectionKey 总的例子 总结 简介 NI ...

  4. 小师妹学JavaIO之:File copy和File filter

    文章目录 简介 使用java拷贝文件 使用File filter 总结 简介 一个linux命令的事情,小师妹非要让我教她怎么用java来实现,哎,摊上个这么杠精的小师妹,我也是深感无力,做一个师兄真 ...

  5. 小师妹学JavaIO之:NIO中那些奇怪的Buffer

    文章目录 简介 Buffer的分类 Big Endian 和 Little Endian aligned内存对齐 总结 简介 妖魔鬼怪快快显形,今天F师兄帮助小师妹来斩妖除魔啦,什么BufferB,B ...

  6. 小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下

    文章目录 简介 虚拟地址空间 详解MappedByteBuffer MapMode MappedByteBuffer的最大值 MappedByteBuffer的使用 MappedByteBuffer要 ...

  7. 小师妹学JavaIO之:NIO中Channel的妙用

    文章目录 简介 Channel的分类 FileChannel Selector和Channel DatagramChannel SocketChannel ServerSocketChannel As ...

  8. 小师妹学JavaIO之:文件File和路径Path

    文章目录 简介 文件和路径 文件中的不同路径 构建不同的Path 总结 简介 文件和路径有什么关系?文件和路径又隐藏了什么秘密?在文件系统的管理下,创建路径的方式又有哪些?今天F师兄带小师妹再给大家来 ...

  9. 小师妹学JavaIO之:文件系统和WatchService

    文章目录 简介 监控的痛点 WatchService和文件系统 WatchSerice的使用和实现本质 总结 简介 小师妹这次遇到了监控文件变化的问题,F师兄给小师妹介绍了JDK7 nio中引入的Wa ...

最新文章

  1. string 类型详解
  2. 数据库-数据类型及主键外键
  3. SQL入侵恢复XP_CMDSHLL与开3389
  4. 分压式静态工作点稳定电路
  5. flutter网络请求dio的get、post、上传文件、下载文件总结
  6. 建模大师怎么安装到revit中_工程师最爱的REVIT插件,让BIM建模溜到飞起!
  7. 如何尽量规避XSS(跨站点脚本)攻击
  8. 索尼android 8,索尼宣布Android 8.0升级名单 Z系列被抛弃
  9. 2019年1月1日起,电商法实施、电子证照“国标”正式发布
  10. Android开源库——xUtils框架
  11. 非透明桥 Non-Transparent Bridging (一)
  12. UIAutomator2常用类之UiObject2
  13. 物联网关键技术————RFID
  14. C语言求N阶乘的方法
  15. babylonjs 分部加载模型_基于babylon3D模型研究3D骨骼动画(1)
  16. EasyMesh最简单的入门级介绍
  17. Kestrel简介_Kestrel Web 服务器简介
  18. 网络营销面临的问题有哪些?
  19. 有关计算机基础的论文,有关计算机基础论文范文
  20. 如何在Libgdx中使用ValueAnimator

热门文章

  1. 计算机中的补码和反码都是二进制吗,计算机中数值型数据二进制形式存储过程中的原码,反码与补码...
  2. linux设置光标位置,linux下光标定位和输出颜色设置
  3. mysql_ping与mysql长连接
  4. 《openssl编程》之openssl简介
  5. __stdcall和__cdecl的区别
  6. Python 的AES加密与解密
  7. 如何让 Spring Boot 启动的更快?
  8. Kafka参数broker.id详解
  9. 深度解密Go语言之反射
  10. 事件过滤器及不规则窗体