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文件源码,资源文件)
随机推荐
- authentication vs authorization 验证与授权的区别
认证和授权的区别 Authentication vs. Authorization简单来说,认证(Authentication )是用来回答以下问题: 用户是谁 当前用户是否真的是他所代表的角色 通常 ...
- 在activity之间传递数据
在activity之间传递数据 一.简介 二.通过intent传递数据 1.在需要传数据的界面调用 intent.putExtra("data1", "我是fry&quo ...
- centos 6 安装python2.7和pip
由于scrapy1.0的发布,想在Linux上测试,所以安装了centos6.6:但是它的python版本为2.6,很多东西都不支持,所以需要升级为2.7: 首先是在window7上安装虚拟机,然后安 ...
- docker自建仓库Registry
因为生产情况下官方容器还是比较慢的,所以会用到自建docker仓库.docker官方提供完整部署仓库的容器,你只需要提供域名证书,把文件系统挂载到容器,一个用户密码文件就可以使用基本的仓库功能了. 启 ...
- 设计模式--抽象工厂模式C++实现
抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...
- SpringAOP源码分析总结
1.Advisor(增强器):充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述).一般有advice和pointcut属性. 祖先接口为org.s ...
- Vue.directive使用注意
首先,Vue.directive要在实例初始化之前,不然会报错,还有,定义的指令不支持驼峰式写法,也会报下面同样的错,虽然在源码中没有找到在哪里统一处理大小写,但是在有关directive的方法中捕捉 ...
- 适配器模式(Adapter Pattern)/包装器
将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 模式中的角色 目标接口(Target):客户所期待的接口.目标可以是具体的或 ...
- APUE学习笔记——5缓冲Buffering、流、文件对象
缓冲的几个基本概念 缓冲的作用:减少系统read和write的次数. 全缓冲 系统标准I/O缓冲区被写满时才进行真正的I/O操作. 磁盘文件一般使用全缓冲 ...
- EFM32 ARM+ KEIl program
1Hardware connection When using the EFM32 starter kit to make a JLINK burn, you must connect the con ...