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);
}
网友评论