美文网首页BUG记录
Java开发中IO流的使用以及异常的处理记录

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

作者: MyFork | 来源:发表于2020-09-28 09:35 被阅读0次

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流的使用以及异常的处理记录

    本文链接:https://www.haomeiwen.com/subject/dvsluktx.html