java面试try-with-resources问题解答
作者:悟空不买菜了 发布时间:2023-09-03 15:08:01
标签:java,try-with-resources
前言:
这个语句的作用是,确保该语句执行之后,关闭每一个资源,也就是说它确保了每个资源都在生命周期结束之后被关闭,因此,比如读写文件,我们就不需要显示的调用close()方法
这个语句的大致模板如下:
我们可以看到我们把需要关闭的资源都放到try()这个括号里面去了,之前都是对异常的捕获,怎么还可以写资源语句,这就是奇妙之处,注意分号啊,最后一个资源可以不用加分号,中间的都要加分号,并且,对于java7来说,变量的声明必须放在括号里面。
下面来说一下具体实现原理:
首先在try()里面的类,必须实现了如下这个接口
这个接口也叫自动关闭资源接口.我们想要写这样的语句,必须去实现它里面的close()方法
对于这个类,很多类都已经做了默认实现,所以我们没有必要显示去山实现这样一个东西,直接拿来用就可以了,比如:
我们这些常见的文件操作类,都已经做了实现。
这样的做法有助于我们写非常复杂的finally块,话不多说,直接上代码:
ImageCopy.java
import java.io.*;
public class ImageCopy {
public static void main(String[] args) {
File srcFile = new File("F:\\java课程资料\\王也.png");
File destFile = new File("E:\\717.png");
copyImage(srcFile,destFile);
}
//这个采用一边读,一边写的思路来做
public static void copyImage(File srcFile, File destFile) {
//这个太繁琐了,我们把它进行改进
/* FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(destFile);
byte[] buff = new byte[1024];
int len = 0;
while((len = fis.read(buff)) != -1) {
fos.write(buff,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}*/
//这里会自动帮我们关闭打开的这些资源
try( FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos)
) {
byte[] buff = new byte[1024];
int len = 0;
while((len = bis.read(buff)) != -1) {
bos.write(buff,0,len);
}
}catch (Exception e) {
e.printStackTrace();
}
}
//采用字符流来读取文本操作
public static void copyText(File srcFile,File destFile) {
InputStreamReader fr = null;
OutputStreamWriter fw = null;
try {
fr = new InputStreamReader(new FileInputStream(srcFile),"gbk");
// fw = new FileWriter(destFile);
fw = new OutputStreamWriter(new FileOutputStream(destFile),"gbk");
char[] buff = new char[1024];
int len = 0;
while((len = fr.read(buff)) != -1) {
System.out.println("读取到的长度:" + len);
fw.write(buff,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
来源:https://blog.csdn.net/Pxx520Tangtian/article/details/125836548
0
投稿
猜你喜欢
- java 枚举的功能挺多,但是坑更多,使用的时候要注意。如下面这个枚举。@Getter@AllArgsConstructorpublic e
- 之前学习 Java 的时候,感觉最难做的一件事情就是配置 jdk 的环境。那叫一个困难啊,Path, JAVA_HOME, CLASSPAT
- /** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... *
- 在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置以tomcat6.0.32为例,需将以下代码
- session简介做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话
- 前端向后端传递参数,后端怎么去接收,就会想到 spring 的注解之前的话,我一直用的是 RequestParam("userNa
- 前言插入排序狭义上指的是简单插入排序(选择集合,比较大小,插入元素),广义上还应该包括希尔排序(分治思想)及其两种实现方式,最激动人心的是
- List集合相信大家在开发过程中几乎都会用到。有时候难免会遇到集合里的数据是重复的,需要进行去除。然而,去重方式有好几种方式,你用的是哪种方
- 目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码
- 绝大部分知识与实例来自O'REILLY的《Java网络编程》(Java Network Programming,Fourth Edi
- 一 点睛注解若想发挥更大作用,还需借助反射机制之力。通过反射,可以取得一个方法上声明的注解的全部内容。一般有两种需求:1 
- 本文实例为大家分享了C#实现简单的计算器功能的具体代码,供大家参考,具体内容如下环境:VS2010及以上版本1、建立个Window窗体应用2
- 什么是Java泛型Java 泛型(generics)是 Jdk 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制, 该机制允许程序
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.获取哈希值hashCode()方法可以返回一个对象的哈希
- 一、项目简述功能: 用户分为患者,医生,管理员,患者可进行注册选择医生 挂号,选择日期,选择号源,医生可进行接诊,管理员可 对用户,医生信息
- 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方w
- 标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者
- 0.解释器(Interpreter)模式定义 :给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
- 本文实例讲述了C#实现将记事本中的代码编译成可执行文件的方法,运行环境为VS2012,具体方法如下:1、在记事本中编写如下代码:using
- 知乎是一个真实的网络问答社区,社区氛围友好、理性、认真,连接各行各业的精英。他们分享着彼此的专业知识、经验和见解,为中文互联网源源不断地提供