Java开发中IO流的使用以及异常的处理记录

本文探讨了在Java开发中处理IO流和异常的不同方法,从传统的try-catch-finally结构到Java 7引入的try-with-resources语句。通过示例代码对比,展示了如何更优雅地确保资源关闭,避免资源浪费并提高代码可读性。try-with-resources自动关闭在try()中声明的资源,简化了异常处理流程。

Java开发中IO流的使用以及异常的处理记录

先来看一些之前使用IO流的代码

C1 之前习惯的写法:
File f = new File(outputPath + projectName + projectVersion+"DirTreeShowMaker.txt");
		try {
			if (!f.exists()) {
				f.createNewFile();
			}
			fw = new FileWriter(f);
			out = new BufferedWriter(fw);
			out.write(dirTreeRecords, 0, dirTreeRecords.length() - 1);
            out.close();
            fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		} 

将流的开启和关闭全部放在了try块当中,如果不关闭,那么这个IO资源就会被一直占用,这样别的地方想用就没有办法用了,所以这造成资源的浪费。而且这个时候关闭资源由于没有写在finally中,如果这个上面的某个地方出现一个异常,整个就关不掉了

C2 放在了try catch外边
File f = new File(outputPath + projectName + projectVersion+"DirTreeShowMaker.txt");
try {
	if (!f.exists()) {
		f.createNewFile();
	}
	fw = new FileWriter(f);
	out = new BufferedWriter(fw);
	out.write(dirTreeRecords, 0, dirTreeRecords.length() - 1);
    } catch (IOException e) {
	e.printStackTrace();
} 
out.close();
fw.close();

问题也是比较类似的,这里也是考虑到了关闭资源,但是这样是关不掉的,因为一旦上面出了问题,下面的语句就执行不到了,所以要放在finally块里才能关闭。

C3 放在finally里面
File f = new File(outputPath + projectName + projectVersion+"DirTreeShowMaker.txt");
		try {
			if (!f.exists()) {
				f.createNewFile();
			}
			fw = new FileWriter(f);
			out = new BufferedWriter(fw);
			out.write(dirTreeRecords, 0, dirTreeRecords.length() - 1);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				//该断言仅在debug版本有效,在release版本当中是无效的
				//assert out != null;
				//如果上面的资源当中出现了异常,try当中
				if ( null != out ){
					out.close();
				}
				if (null != fw ){
					fw.close();
				}
			} catch (IOException e) {
				System.out.println("在编排包信息文件生成中"+e.getMessage());
			}
		}

但是如果流一旦多了就会导致整个语句结构非常繁琐,因为会循环嵌套try-catch-finally语句,尤其是在finally子句中,close()方法也会抛出异常,就导致每次都需要使用try-catch来包裹close()方法

较为优雅的方法

因此在java7之后,可以使用try-with-resources语句来释放java流对象

相对于C3当中啰嗦的写法

下面来看使用了try-with-resources后的效果:

if (!f.exists()) {
	f.createNewFile();
}
try (FileWriter fw = new FileWriter(f);
	BufferedWriter out = new BufferedWriter(fw);) {
    out.write(dirTreeRecords, 0, dirTreeRecords.length() - 1);
     } catch (IOException e) {
        e.printStackTrace();
    }

try-with-resources将会自动关闭try()中的资源,并且将先关闭后声明的资源。

如果不``catch IOException`整个结构就会更加完美,Oh!Nice

if (!f.exists()) {
	f.createNewFile();
}
try (FileWriter fw = new FileWriter(f);
	BufferedWriter out = new BufferedWriter(fw);) {
    out.write(dirTreeRecords, 0, dirTreeRecords.length() - 1);
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值