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 class="lazy" data-srcFile = new File("F:\\java课程资料\\王也.png");
File destFile = new File("E:\\717.png");
copyImage(class="lazy" data-srcFile,destFile);
}
//这个采用一边读,一边写的思路来做
public static void copyImage(File class="lazy" data-srcFile, File destFile) {
//这个太繁琐了,我们把它进行改进
//这里会自动帮我们关闭打开的这些资源
try( FileInputStream fis = new FileInputStream(class="lazy" data-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 class="lazy" data-srcFile,File destFile) {
InputStreamReader fr = null;
OutputStreamWriter fw = null;
try {
fr = new InputStreamReader(new FileInputStream(class="lazy" data-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();
}
}
}
}
}
到此这篇关于java面试try-with-resources问题解答的文章就介绍到这了,更多相关java try-with-resources 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341