java io底层原理_小师妹学JavaIO之:try with和它的底层原理
发布日期:2021-06-24 15:43:01 浏览次数:2 分类:技术文章

本文共 3175 字,大约阅读时间需要 10 分钟。

标签:mamicode   使用   href   water   learn   dde   资源   ide   遇到

目录

简介

IO关闭的问题

使用try with resource

try with resource的原理

自定义resource

总结

简介

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

20200515092001191908.jpg

IO关闭的问题

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

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

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

一个命令是 ulimit -a

58f23e7622f67863c5b65ed7788e3936.png

第二个命令是

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("帮助小师妹解决问题!");

}

@Override

public 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

本文作者:flydean程序那些事

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

本文来源:flydean的博客

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

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

标签:mamicode   使用   href   water   learn   dde   资源   ide   遇到

转载地址:https://blog.csdn.net/weixin_33613462/article/details/114524483 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java iterator类_在同一类中实现Java Iterator和Iterable?
下一篇:Java使用jfreechart画饼图_JFreeChart 使用一 饼图之简单实例

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月17日 20时21分03秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android性能调优!阿里面试100%会问到的JVM,已拿offer入职 2019-04-29
安卓app开发书籍!掌握这些Android开发热门前沿知识,面试心得体会 2019-04-29
安卓app开发教程pdf!Android组件化架构实践,值得收藏! 2019-04-29
安卓app开发架构!让你明明白白的使用RecyclerView,满满干货指导 2019-04-29
安卓app软件开发教程!为什么Flutter能最好地改变移动开发?系列篇 2019-04-29
安卓framework层开发!Android高级工程师必看系列,建议收藏 2019-04-29
安卓framework层开发!给后辈的一点建议,持续更新中 2019-04-29
安卓ios开发培训!华为Android面试真题解析,高级面试题+解析 2019-04-29
安卓sdk开发!阿里面试100%会问到的JVM,架构师必备技能 2019-04-29
安卓ui开发语言!Activity的6大难点,你会几个?一线互联网公司面经总结 2019-04-29
android学习路线!字节跳动Android三面凉凉,社招面试心得 2019-04-29
android定位!Android开发究竟该如何学习,全网疯传 2019-04-29
android定时任务!互联网寒冬公司倒闭后,吐血整理 2019-04-29
android定时启动app!细数Android开发者的艰辛历程,大厂面经合集 2019-04-29
android定时开关机!微信小程序的事件处理,学习路线+知识点梳理 2019-04-29
android实战!带你一步一步深入Handler源码,再不刷题就晚了! 2019-04-29
android布局优化!2021年Android工作或许更难找,终局之战 2019-04-29
android布局详解!有了这些中高端面试专题-大厂还会远吗?这原因我服了 2019-04-29
c安卓开发视频教程!我把所有Android第三方库整理成了PDF,醍醐灌顶! 2019-04-29
flutter技术胖!那些年我们一起踩过算法与数据结构的坑,建议收藏 2019-04-29