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