• 资源释放的方式(try - with - resource 和 try - catch - finally)


    1、try - catch - finally

    • finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中的释放资源
    • 特点:被finally控制的语句最终一定会执行,除非JVM退出
    • 异常处理标准格式:try . . . catch . . . finally
    1. package com.csdn.d3_resource;
    2. import java.io.*;
    3. public class TryCatchFinallyDemo {
    4. public static void main(String[] args) {
    5. OutputStream os = null;
    6. InputStream is = null;
    7. try {
    8. //1、创建一个字节输入流管道与原视频接通
    9. is = new FileInputStream("E:\\videocopy" +
    10. "\\07、文件字节输出流、" +
    11. "文件拷贝、" +
    12. "资源释放的2种方式.mp4");
    13. //2、创建一个字节输出流管道与目标文件接通
    14. os = new FileOutputStream("E:\\videocopy\\new.mp4");
    15. //3、定义一个字节数组转移数据
    16. byte[] buffer = new byte[1024];
    17. //记录每次读取的字节数
    18. int len;
    19. while ((len = is.read(buffer)) != -1) {
    20. os.write(buffer, 0, len);
    21. }
    22. System.out.println("复制完成了");
    23. } catch (IOException e) {
    24. throw new RuntimeException(e);
    25. } finally {
    26. //无论代码是正常结束,还是出现异常都要最后执行这里
    27. System.out.println("finally");
    28. //4、关闭流
    29. try {
    30. if (os != null) {
    31. os.close();
    32. }
    33. } catch (IOException e) {
    34. throw new RuntimeException(e);
    35. }
    36. try {
    37. if (is != null) {
    38. is.close();
    39. }
    40. } catch (IOException e) {
    41. throw new RuntimeException(e);
    42. }
    43. }
    44. }
    45. }

    1.1、try - catch - finally的作用

    • finally代码块是最终一定要执行的,可以在代码执行完毕的最后用于释放资源。
    • 除非JVM退出,System.exit(status:0),finally代码块才不会执行

     2、try - with - resource

    • finally虽然可以用于释放资源,但是释放资源的代码过于繁琐?

      2.1、JDK7中改进方案

    try( 定义流对象 ){

            可能出现异常的代码;

    }catch(异常类名  变量名){

            异常的处理代码;

    }

    1. package com.csdn.d3_resource;
    2. import java.io.*;
    3. public class TryWithResourceDemo {
    4. public static void main(String[] args) {
    5. try (
    6. //这里面只能放置资源对象,用完会自动关闭;自动调用资源对象的close方法关闭资源(即使出现异常也会做关闭操作)
    7. //1、创建一个字节输入流管道与原视频接通
    8. InputStream is = new FileInputStream("E:\\videocopy" +
    9. "\\07、文件字节输出流、" +
    10. "文件拷贝、" +
    11. "资源释放的2种方式.mp4");
    12. //2、创建一个字节输出流管道与目标文件接通
    13. OutputStream os = new FileOutputStream("E:\\videocopy\\new.mp4");
    14. ) {
    15. //3、定义一个字节数组转移数据
    16. byte[] buffer = new byte[1024];
    17. //记录每次读取的字节数
    18. int len;
    19. while ((len = is.read(buffer)) != -1) {
    20. os.write(buffer, 0, len);
    21. }
    22. System.out.println("复制完成了");
    23. } catch (IOException e) {
    24. throw new RuntimeException(e);
    25. }
    26. }
    27. }

    2.2、JDK9中改进方案

    定义输入流对象;

    定义输出流对象;

    try( 输入流对象输出流对象 ){

            可能出现异常的代码;

    }catch(异常类名  变量名){

            异常的处理代码;

    }

    1. package com.csdn.d3_resource;
    2. import java.io.*;
    3. public class TryWithResourceDemo {
    4. public static void main(String[] args) throws FileNotFoundException {
    5. //1、创建一个字节输入流管道与原视频接通
    6. InputStream is = new FileInputStream("E:\\videocopy" +
    7. "\\07、文件字节输出流、" +
    8. "文件拷贝、" +
    9. "资源释放的2种方式.mp4");
    10. //2、创建一个字节输出流管道与目标文件接通
    11. OutputStream os = new FileOutputStream("E:\\videocopy\\new.mp4");
    12. try (
    13. is;os
    14. ) {
    15. //3、定义一个字节数组转移数据
    16. byte[] buffer = new byte[1024];
    17. //记录每次读取的字节数
    18. int len;
    19. while ((len = is.read(buffer)) != -1) {
    20. os.write(buffer, 0, len);
    21. }
    22. System.out.println("复制完成了");
    23. } catch (IOException e) {
    24. throw new RuntimeException(e);
    25. }
    26. }
    27. }

    3、注意:

    • JDK 7 以及 JDK 9 的()中只能放置资源对象,否则报错
    • 什么是资源呢?
    • 资源都是实现了Closeable或者AutoCloseable接口的类对象
  • 相关阅读:
    cmd命令行设置 windows 设置环境变量
    Keras学习记录之模型
    面对中小型机房动力环境该如何实现监控?
    解决问题遇到的问题
    metrics.accuracy_score 和metrics.roc_auc_score的计算
    基于Java的插件化集成项目实践
    装修干货|卧室常见3个软装搭配问题。福州中宅装饰,福州装修
    预测足球世界杯比赛
    每天5分钟快速玩转机器学习算法:带有核函数的支持向量机模型
    基于GPIO子系统编写LED驱动
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133036638