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

    科技2022-08-11  110

    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); }
    Processed: 0.015, SQL: 8