Java——IO流(一)-(8/8):释放资源-try-catch-finally、try-catch-resource

news2024/10/7 14:34:19

目录

try-catch-finally

介绍

实例演示1

实例演示2

try-catch-resource

介绍

实例演示


try-catch-finally

介绍

普通的释放流的方法可能会因中间的异常或是其他原因,导致程序执行不到释放流的代码就结束了,会有资源浪费的风险,所以建议使用另外的资源释放方式来避免这种资源浪费。

try{

        ...

        ...

}catch (IOException e){

        e.printStack();

}finally{

        ...

}

  • finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止
  • 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。

实例演示1

public class Test1 {
    public static void main(String[] args) {
        try {
            System.out.println((10 / 2));
//        return;                   //跳出方法的执行————依旧会执行finally区的代码
//        System.exit(0);     //终止虚拟机————不会执行finally区的代码
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("===finally执行了一次===");
        }

    }
    public static int chu(int a,int b){
        try {
            return a/b;
        } catch (ArithmeticException e) {
            e.printStackTrace();
            return -1;  //代表程序出现异常
        } finally {
            //千万不要在finally中返回数据!
//            return 111;
            
        }
    }
}

运行结果:

实例演示2

对上篇的文件复制案例进行修改:

此处会报错的原因:

IDEA担心在finally执行之前,我们就已经把流给释放了,就会产生空指针异常;

或者是在流创建出来前(未赋值)就产生了异常,于是执行finally区的代码同样会空指针异常,

所以使用这个方法我们需要再嵌套一层try-catch

import java.io.*;

public class copyFile {
    public static void main(String[] args){
        InputStream is = null;
        OutputStream os = null;
        try {
            //需求:复制照片
            //1.创建一个字节输入流管道与源文件接通
            is = new FileInputStream("C:/Users/Administrator/Pictures/flower.jpg");

            //2.创建一个字节输出流管道与目标文件接通
            os = new FileOutputStream("C:/Users/Administrator/Desktop/test.jpg");

            //多加一条语句
            System.out.println(10 / 0);

            //3.创建一个字节数组,负责转移字节数据
            byte[] buffer = new byte[1024];     //1KB

            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少
            int len;    //记住每次读取了多少个字节
            while( (len = is.read(buffer)) != -1 ){
                os.write(buffer,0,len);
            }
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源的操作
            try {
                os.close();  //从内到外关闭流
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

try-catch-resource

介绍

JDK7开始提供了更简单的资源释放方案:try-with-resource

try(定义资源1;定义资源2;...){        该资源使用完毕后,会自动调用其close()方法,完成对资

        可能出现异常的代码;             源的释放

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

        异常的处理代码;

}

  •  ()中只能放置资源,否则报错
  • 资源一般指的是最终实现了AutoCloseable接口。资源都会有一个close方法

public abstract class InputStream implements Closeable{ }

public abstract class OutputStream implements Closeable,Flushable{ }

public interface Closeable extends AutoCloseable{ }

实例演示

同样改造一下文件复制的案例:

import java.io.*;

public class copyFile {
    public static void main(String[] args) throws Exception{
        try (
                //1.创建一个字节输入流管道与源文件接通
                InputStream is = new FileInputStream("C:\\Users\\Administrator\\Pictures\\flower.jpg");

                //2.创建一个字节输出流管道与目标文件接通
                OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.jpg");

                //注意:这里只能放置资源对象 (流对象)
        ){
            //需求:复制照片

            //3.创建一个字节数组,负责转移字节数据
            byte[] buffer = new byte[1024];     //1KB

            //4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少
            int len;    //记住每次读取了多少个字节
            while( (len = is.read(buffer)) != -1 ){
                os.write(buffer,0,len);
            }
            os.close();  //从内到外关闭流
            is.close();
            System.out.println("复制完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

END


学习自:黑马程序员——Java课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门JavaWeb之 JavaBean 实体类

JavaBean 有特定写法: 1.必须有一个无参构造 2.属性必须私有 3.必须有对应的 get/set 方法 一般用来和数据库的字段做映射 ORM:对象关系映射 表->类 字段->属性 行记录->对象 连接数据库 没有的话去 Settings -> Plugins 搜索 Data…

JavaScript--js基础(详细 全面)

目录 前言: JavaScript 是什么?JavaScript 简介 1.JavaScript历史 2.JavaScript 具有以下特点 第一个JavaScript程序 1.在脚本文件中编写JavaScript代码 2.JavaScript代码执行顺序 基本语法 1.变量 2.数据类型 3.算术运算符 4.赋值运算 5.字符串运算符 6…

GoSync+华为智能穿戴使用指导

GoSync官方简介: GoSync 是一款免费应用程序,主要用于将您的可穿戴设备中的步行、跑步、骑自行车和游泳等活动数据同步到您的 Google Fit 和其他健身平台。在开始同步数据之前,您需要将您的可穿戴设备账户与您的健身平台账户连接起来。在创建…

Modbus为何要转成EtherCAT

1. Modbus是什么? Modbus是一种工业通信协议,广泛应用于工业自动化领域。它支持多种通信方式,包括RS-232、RS-485和TCP/IP等。Modbus协议简单易用,能够实现设备之间的数据交换和控制命令的传输。然而,它在数据传输速率…

微软推出最新视觉基础模型Florence-2 可在浏览器运行

据微软官方消息,微软推出视觉基础模型Florence-2,该模型现已能够在支持WebGPU的浏览器中100%本地运行。Florence-2-base-ft是一个拥有2.3亿参数的视觉基础模型,采用基于提示的方法来处理广泛的视觉和视觉语言任务。 该模型支持多种功能&…

FME实现批量合并shapefile文件数据,并提取原文件名,输出到属性表字段中的解决方法

目录 一、实现效果 二、实现过程 1.读取数据 2.暴露文件名属性 3.设置文件名字段 4.输出成果 5.模板的使用 三、总结 今天来介绍如何使用FME软件来实现对多个shapefile数据进行批量合并,同时提取原文件名并存储到合并后shapefile数据属性表字段中的方法&…

由监官要求下架docker hub镜像导致无法正常拉取镜像

问题:下载docker镜像超时 error pulling image configuration: download failed after attempts6: dial tcp 202.160.128.205:443: i/o timeout解决办法:配置daemon.json [rootbogon aihuidi]# cat /etc/docker/daemon.json {"registry-mirrors&qu…

<项目> 日志系统

目录 前言: 一、项目介绍 二、为什么需要日志系统 三、日志系统技术实现 (一)同步写⽇志 (二)异步写⽇志 四、前置技术学习 (一)不定参宏函数 (二)C语言不定参数…

mysql安装创建数据库防止踩坑

为了安装MySQL的家人们走弯路,稍微有些啰嗦,讲述我安装的时遇到的问题,如何解决。仔细看看离成功不远。 mysql下载链接 MySQL :: Download MySQL Community Server windows下安装mysql-8.0.29-winx64,下载安装包后解压到文件夹中…

摄影后期色彩管理流程(Lightroom篇)

在摄影后期处理中,色彩管理是确保图像从捕捉到输出的一致性和准确性的关键。Lightroom 和 Photoshop 其实已经将这套色彩管理流程作为默认选项,如果实质操作时仍存在色彩偏差的问题,可参考以下内容。 ProPhoto RGB > Adobe RGB > sRGB …

clickhouse count和uniqCombined

count(distinct ) 和 uniqCombined 获取去重后的总数。 去重:order by distinct argMax group by 哪个好?? clickhouse数据去重函数介绍(count distinct)_clickhouse distinct-CSDN博客

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性,在任意域上进行任意的多目标跟踪,而无需任何额外的标注。 其核心思想就是在训练的过程中,利用strong augmentation对一张图片进行变换,然后用SAM分割出其中的对象,因此可以找到一组图…

注意力机制在大语言模型中的应用

在大语言模型中,注意力机制(Attention Mechanism)用于捕获输入序列中不同标记(token)之间的关系和依赖性。这种机制可以动态地调整每个标记对当前处理任务的重要性,从而提高模型的性能。具体来说&#xff0…

Qt通过句柄获取其它进程控件实例

1.通过spy获取想要获取控件的句柄id 通过spy获取另一个软件的文本框的句柄 2.Qt写代码, 根据句柄获取文本框的内容 void getTextFromExternalWindow(HWND hwnd) {const int bufferSize 256;TCHAR buffer[bufferSize];// 获取窗口文本内容int length GetWindowT…

svn明明都在环境变量中添加了,但还是无法在cmd中生效

svn明明都在环境变量中添加了,但还是无法在cmd中生效 cmd显示原因问题解决 cmd显示 svn不是内部或外部命令,也不是可运行的程序或批处理文件 原因 安装svn一直点下一步下一步…,没有勾选command line client。 问题解决 1.按下winx&…

CSS|04 复合选择器伪类选择器属性选择器美化超链接

基本选择器:见上篇基本选择器 复合选择器选择器1,选择器2{属性:值;} 多元素选择器,同时匹配选择器1和选择器2,多个选择器之间用逗号分隔举例: p,h1,h2{margin:0px;}E F{属性:值;} 后代元素选择器,匹配所有属于E元素后…

Linux实用命令练习

目录 一、常用命令 二、系统命令 三、用户和组 四、权限 五、文件相关命令 六、查找 七、正则表达式 八、输入输出重定向 九、进程控制 十、其他命令 1、远程文件复制:scp 2、locate查找 3、which命令 4、设置或显示环境变量:export 5、修…

解决所有终端中文输出乱码的问题

一、系统自带的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe,和PowerShell默认使用“当前系统区域设置”设定好的936 (ANSI/OEM - 简体中文 GBK)语言编码。 1、[当前代码页] 的936 (ANSI/OEM - 简体中文 GBK) 是导致中文乱码的原因 在控制面板→…

[分布式网络通讯框架]----Protobuf安装配置--附带每一步截图

Protobuf Protobuf(Protocol Buffers)协议是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。 为什么要使用Protobuf Protobuf 在许多领域都得到…

网上零食销售系统

摘 要 随着互联网的快速发展,网上销售已成为零售业的重要组成部分。在众多的线上购物品类中,零食销售因其受众广泛、购买频率高、消费金额适中等特点,一直备受关注。然而,传统的零食销售方式,如实体店铺销售&#xff…