java-文件流正确关闭资源
用文件流来拷贝一个文件,用到文件字节输入流(FileInputStream)和文件字节输出流(FileOutputStream),用输入流把字节文件读到缓冲数组中,然后将缓冲数组中的字节写到文件中,就很好的完成了文件的复制操作。
来,看一下代码
//1.创建源和目标
File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
//2.创建输入流和输出流
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(targetFile);
//3.输入 输出操作
byte[] buffer = new byte[10];
int len = 0;
while((len = in.read(buffer)) != -1){
//String str = new String(buffer,0,len);
out.write(buffer, 0, len);;
}
//4.关闭资源文件
in.close();
out.close();
完了你会发现出现了

全是错误,那是因为输出输出可能会出现异常,可能你会直接抛出去,那么怎么正确处理这些异常情况?
当然是try-catch-finally
FileInputStream in = null;
FileOutputStream out = null;
try{//可能出现问题的代码
//1.创建源和目标
File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
//2.创建输入流和输出流
in = new FileInputStream(srcFile);
out = new FileOutputStream(targetFile);
//3.输入 输出操作
byte[] buffer = new byte[10];
int len = 0;
while((len = in.read(buffer)) != -1){
//String str = new String(buffer,0,len);
out.write(buffer, 0, len);;
}
}catch(Exception e){//处理异常
e.printStackTrace();
}finally{
//4.关闭资源文件
try{
in.close();
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
好了,到这里之后异常终于消除了,然而这个程序还是有问题:
当程序执行到 in = new FileInputStream(srcFile); 的时候,假设有个异常,然后程序后去处理这个异常,根本没有执行下面的程序,然而这时候out还是null,在finally中还关闭了out,本身没有异常,你制造了异常。 那么怎么解决呢?
那么将它们分开try就ok了:
finally{
//4.关闭资源文件
try{
if(in != null){
in.close();
}
}catch(Exception e){
e.printStackTrace();
}
try{
if(out != null){
out.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
到这你会发现程序的主体都在上面,然而下面却处理了这么多异常还有关闭资源,程序变得很难看!然而java7之后,出现了自动关闭资源的机制,我去,这感情好啊,来欣赏一下:
File srcFile = new File("C:/Users/15626/Desktop/test/123.txt");
File targetFile = new File("C:/Users/15626/Desktop/test/123_copy.txt");
try(//打开资源的代码
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(targetFile);
){
//3.输入 输出操作
byte[] buffer = new byte[10];
int len = 0;
while((len = in.read(buffer)) != -1){
//String str = new String(buffer,0,len);
out.write(buffer, 0, len);;
}
}catch(Exception e){
e.printStackTrace();
}
嗯,这个新特性很好!
try(打开资源的代码 ){
可能存在异常的代码
}catch(){
处理异常信息
}
java-文件流正确关闭资源的更多相关文章
- Java文件流应用:剪切文件
剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...
- Java文件流应用:复制文件
文件复制步骤 代码: package 文件流应用复制文件; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...
- Java 文件流操作.
一.概念 在Java中,文件的输入和输出是通过流(Stream)来实现的.一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是 Internet 上的某个 URL.对 ...
- [翻译][Java]ExecutorService的正确关闭方法
https://blog.csdn.net/zaozi/article/details/38854561 https://blog.csdn.net/z69183787/article/details ...
- Java文件 ---流
分类 根据数据走向,分为输入流.输出流 根据处理的数据类型,分为字节流.字符流 字节流 可以处理所有类型的数据,如MP3.图片.文字.视频等.在读取时,读到一个字节就返回一个字节. 在Java中对应的 ...
- Java文件流下载并提示文件不存在
做文件下载功能的时候,一般使用流的形式下载文件, 如果源文件不存在,下载页面可能就会没有提示,或者一片空白 用户操作之后可能一头雾水,那如何友好提示呢? 想到的有两种 1.可以尝试下载一个名称为:文件 ...
- Java文件流之练习
1 )将"今年是反法西斯胜利70周年,举国欢庆,所以要放假啦" 字符串 使用文件字符输出流 写入到oldhappy.txt文件中,复写10000行, 要求换行 在文件的开头写入当前 ...
- java文件流操作
package common; import java.io.*;import java.math.BigDecimal;import java.util.ArrayList;import java. ...
- 9:关于Maven工程的文件标识(定义java文件源码,资源文件)
随机推荐
- node查询mongo
http://www.cnblogs.com/whoamme/p/3467374.html nosql的数据库的查询:可以分为查询所有,查询一个,条件查询,和表的关联查询.(这个另外在写一个独立的mo ...
- JavaScript 打印Div内容
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Untitled Page& ...
- http协议与soap协议区别
- Java连接MySQL数据库——代码
工具:eclipse MySQL5.7.17 MySQL连接驱动:mysql-connector-java-5.1.43.jar 加载驱动:我是用MAVEN进行管理 数据库连接信息: 数据库名称:wu ...
- IOS-简单动画
iOS那些简单的动画(不定期更新) 字数669 阅读1118 评论16 喜欢59 关于 Core Animation Core Animation是一组非常强大的动画处理API,使用它能做出很多优雅的 ...
- DIV+ul+LI实现表格效果以及div带滑动条
写这个是为了给自己一个好好的笔记,以免下次需要的时候又到处找,费神费事费时费力.开始吧! 1.先看看效果 2.网页代码 <!DOCTYPE html PUBLIC "-//W3C//D ...
- 十八、dbms_repair(用于检测,修复在表和索引上的损坏数据块)
1.概述 作用:用于检测,修复在表和索引上的损坏数据块. 2.包的组成 1).admin_tables语法:dbms_repair.admin_tables(table_name in varchar ...
- 过滤器(Filter)
1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如 ...
- xss 防御
系列 防御原则 第一.在输入方面对所有用户提交内容进行可靠的输入验证,提交内容包括URL.查询关键字.http头.post数据等 第二.在输出方面,在用户输内容中使用 <XMP>标签 还是 ...
- Lua基础---一维数组与多维数组
Lua语言中,数组和C还是有区别的,Lua的数组下标从1开始计数,而C语言的数组下标从0开始计数,我想这可能是设计Lua的人想要符合人的思维习惯而去这么设计的. 数组,也就是按相同类型,在内存中顺序排 ...