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);
}

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

被折叠的 条评论
为什么被折叠?



