java 文件中先关闭什么流_Java代码中关闭流需要注意的一些细节

我们在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("流关闭失败");}}}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值