新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > JAVA

Java代码中关闭流需要注意的一些细节

时间:2020-01-16 09:45:40  来源:  作者:

我们在JAVA项目中会处理流,流使用完成后一定要注意关闭流,但是在关闭流时有一些注意点容易忽略,我们以文件流为例先看两个错误实例。

/** * 错误实例1 *  * @author 今日头条号「IT徐胖子」 * */public class Test1 {public void copyFile() {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("c:\aaa.txt"); // 代码1fw = new FileWriter("c:\bbb.txt"); // 代码2char[] charBuffer = new char[1024];int len = 0;while ((len = fr.read(charBuffer)) != -1) {fw.write(charBuffer, 0, len);}System.out.println("文件复制成功");} catch (IOException e) {throw new RuntimeException("文件复制失败");} finally {try {fr.close(); // 代码3fw.close(); // 代码4} catch (IOException e) {throw new RuntimeException("流关闭失败");}}}}

Test1问题在于如果代码1出错,fr根本就没有初始化,执行代码3时就会报空指针异常。代码2和代码4同样是这个道理。

/** * 错误实例2 *  * @author 今日头条号「IT徐胖子」 * */public class Test2 {public void copyFile() {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("c:\aaa.txt"); // 代码1fw = new FileWriter("c:\bbb.txt"); // 代码2char[] charBuffer = new char[1024];int len = 0;while ((len = fr.read(charBuffer)) != -1) {fw.write(charBuffer, 0, len);}System.out.println("文件复制成功");} catch (IOException e) {throw new RuntimeException("文件复制失败");} finally {try {if (null != fr) {fr.close(); // 代码3}if (null != fw) {fw.close(); // 代码4}} catch (IOException e) {throw new RuntimeException("流关闭失败"); // 代码5}}}}

Test2加上是否为空的判断可以避免空指针异常。但是如果代码3执行出错,程序会直接进入代码5,而代码4根本没有得到执行,导致流无法关闭。我们来看一个正确实例。

/** * 正确实例 *  * @author 今日头条号「IT徐胖子」 * */public class Test3 {public void copyFile() {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("c:\aaa.txt");fw = new FileWriter("c:\bbb.txt");char[] charBuffer = new char[1024];int len = 0;while ((len = fr.read(charBuffer)) != -1) {fw.write(charBuffer, 0, len);}System.out.println("文件复制成功");} catch (IOException e) {throw new RuntimeException("文件复制失败");} finally {try {if (null != fr) {fr.close();}} catch (IOException e) {throw new RuntimeException("流关闭失败");}try {if (null != fw) {fw.close();}} catch (IOException e) {throw new RuntimeException("流关闭失败");}}}}


Tags:Java   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
我们在Java项目中会处理流,流使用完成后一定要注意关闭流,但是在关闭流时有一些注意点容易忽略,我们以文件流为例先看两个错误实例。/** * 错误实例1 * * @author 今日头条号...【详细内容】
2020-01-16   Java  点击:(0)  评论:(0)  加入收藏
1. 原始单据与实体之间的关系可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或...【详细内容】
2019-10-28   Java  点击:(1)  评论:(0)  加入收藏
1.简介在Java应用程序中,Java将自动导入包java.lang, 包含从NullPointerException到Object,Math和String的许多常用类。java.lang.System中的类是 final 类,也就是说,我们不能继...【详细内容】
2020-01-10   Java  点击:(8)  评论:(0)  加入收藏
ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带...【详细内容】
2020-01-08   Java  点击:(8)  评论:(0)  加入收藏
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知...【详细内容】
2020-01-06   Java  点击:(13)  评论:(0)  加入收藏
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解1....【详细内容】
2020-01-03   Java  点击:(8)  评论:(0)  加入收藏
一个优秀且经验丰富的Java开发人员的特点之一是对API的广泛了解,包括JDK和第三方库。我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Bloch建议如...【详细内容】
2020-01-03   Java  点击:(10)  评论:(0)  加入收藏
做java开发的,对jar包和war包肯定接触的不少。我们有必要对他们做一个深入的了解。现在我们整理一下。 jar包的介绍JAR(Java Archive)是与平台无关的文件格式,它允许将许多文件...【详细内容】
2019-12-31   Java  点击:(15)  评论:(0)  加入收藏
导读:在实际项目中常会遇到需要连接服务器获取文件的场景,如账务系统需要通过连接行方的sftp服务器拉取回单文件。本文将主要讨论使用Java中的jsch与sftp服务器实现ssh免密连...【详细内容】
2019-10-20   Java  点击:(3)  评论:(0)  加入收藏
说到 I/O,想必大家都不会陌生, I/O 英语全称:Input/Output,即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。...【详细内容】
2019-12-27   Java  点击:(18)  评论:(0)  加入收藏
soul网关发布2.1.0版本 (做Java界最好的API-Gateway) 这是soul网关开源以来的最大的一次更新,收集了很多社区反馈的问题,进行了更新. 之前的文档不是很完善,使用成本较高,这里先...【详细内容】
2019-12-27   Java  点击:(25)  评论:(0)  加入收藏
我们通过为自行车商店构建示例应用程序来学习如何使用 JPA。-- Stephon Brown(作者) 对应用开发者来说, Java 持久化 API(Java Persistence API)(JPA)是一项重要的 java 功能,需...【详细内容】
2019-12-27   Java  点击:(15)  评论:(0)  加入收藏
介绍Centos系统上安装Jenkins部署Spring Boot项目流程,并通过github Webhooks通知Jenkins代码更新信息并自动重新部署项目。准备环境 JDK1.8 yum install java-1.8.0-openjd...【详细内容】
2019-12-27   Java  点击:(13)  评论:(0)  加入收藏
前期准备工作1.云服务器2.备案的域名3.本地调试需要修改hosts文件,将域名映射到127.0.0.1申请QQ互联,并成为开发者申请QQ互联创建应用时需要备案域名,所以建议提前准备备案域名...【详细内容】
2019-12-26   Java  点击:(21)  评论:(0)  加入收藏
一、为什么要用线程池 降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。...【详细内容】
2019-12-26   Java  点击:(8)  评论:(0)  加入收藏
Java 创建于 1995 年,目前有 134861 个网站使用 Java,如 ESPN、SnapDeal、阿里巴巴等。在其 24 年的发展历程中,Java 已经证明了自己是用于自定义软件开发的高级通用编程语言。...【详细内容】
2019-12-25   Java  点击:(21)  评论:(0)  加入收藏
01. JUnit第一个要说的当然是JUnit了,JUnit毕竟是Java圈目前最知名及常用的测试框架。JUnit之所以能够成为Java圈中最热门的测试库,是因为对于很多项目而言,单元测试是非常重要...【详细内容】
2019-12-25   Java  点击:(12)  评论:(0)  加入收藏
实际应用中,目标字符串的生成可能需要多个数据的拼接。  由于应用频繁,几乎是所有编程语言都必须掌握的操作,当然每种语言具有各自特点。  本文将通过代码实例详细介绍...【详细内容】
2019-12-25   Java  点击:(16)  评论:(0)  加入收藏
对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。...【详细内容】
2019-12-25   Java  点击:(17)  评论:(0)  加入收藏
日常工作中,不管你是写Unit Test,还是采用TDD的编程方式进行开发,都会遇到断言。而断言的风格常见的会有Assert、BDD风格,对于这些常见的断言风格你怎么选择呢?01 Assert风格JUni...【详细内容】
2019-12-25   Java  点击:(15)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条