J01-Java IO流总结一 《异常捕获》
下面演示java中处理I/O操作时的异常的正确方式,总结自书籍,书名忘啦~
先看一种不正确的方式
方式一:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test3 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; //打开文件
try {
fis = new FileInputStream("e:/test_file/a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} //访问文件
try {
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
}
} catch (IOException e) {
e.printStackTrace();
} //关闭文件
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
注意到前面的代码在读取文件的try代码块完成后关闭了文件流,虽然这种方法在某些情况下有用,但是Java提供了一种在通常情况下更好的方法。即,在finally代码块中调用close()。在这种方法中,访问文件的所有方法都包含在一个try代码块中,finally代码块用来关闭文件。这样,无论try代码块如何终止,文件都会被关闭。使用前面的示例,下面的方式二演示了如何重新编码读取文件的try代码块
方式二:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; //打开文件
try {
fis = new FileInputStream("e:/test_file/a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
} //访问文件
try {
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这种方法的优点之一是,如果访问文件的代码由于某种与I/O无关的异常而终止,finally代码块仍然会关闭文件。虽然在这个例子中这不是一个问题,因为在发生未预料到的异常时程序简单地结束了,但是在大型的程序中却可能造成很多麻烦。使用finally可以避免这些麻烦。
有时,将程序中打开文件和访问文件的部分放到一个try代码块,然后使用一个finally代码块关闭文件,这样更加简单。例如,下面是另一种编写方式
方式三(推荐方式):
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null; //先初始化为null
byte[] buffer = new byte[1024];
int temp = 0; try {
//打开文件
fis = new FileInputStream("e:/test_file/a.txt"); //访问文件
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
} } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
if(null != fis) { //非空判断
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在这种方法中,注意fis被初始化为null。然后,在finally代码块中,只有fis不为null时才关闭文件。可以这么做的原因是,只有文件被成功打开,fis才不为null。因为,如果在打开文件的过程中出现异常,就不应调用close()方法,否则会报NullPointerException。推荐使用这种方式!
前面示例中的try/catch序列还可以更加精简。因为FileNotFoundException是IOException的一个子类,所以不需要单独捕获。例如,这个catch语句可以用来捕获两个异常,从而不必单独捕获FileNotFoundException。这种情况下,将显示描述错误的标准异常信息。
方式四:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class Test4 {
public static void main(String[] args) {
FileInputStream fis = null;
byte[] buffer = new byte[1024];
int temp = 0; try {
//打开文件
fis = new FileInputStream("e:/test_file/a.txt"); //访问文件
while(-1 != (temp = fis.read(buffer))) {
System.out.print(new String(buffer, 0, temp));
} } catch (IOException e) {
e.printStackTrace();
} finally {
//关闭文件
try {
if(null != fis) { //非空判断
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在这种方法中,任何错误,包括打开文件时发生错误,都会被一个catch语句处理。这种方法十分简洁。但要注意,如果想单独处理打开文件时发生的错误(例如,用户错误地键入了文件名),这种方法就不合适了。
最后放一张图

J01-Java IO流总结一 《异常捕获》的更多相关文章
- java io流 运行错误时,保存异常到文件里面
java io流 运行错误时,保存异常到文件里面 下面这个实例,运行后,输入数字,为正确,如果输入字符串,则报错,保存错误信息 //运行错误时,保存异常到文件里面 //下面这个实例,运行后,输入数字, ...
- 【Java基础】Java IO流的总结
Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流题库
一. 填空题 Java IO流可以分为 节点流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...
- Java IO流详尽解析
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java IO流学习总结一:输入输出流
Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...
- Java IO流详尽解析(转)
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- java IO流 总结
[-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...
- 学习笔记-java IO流总结 转载
1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...
随机推荐
- Devexpress VCL Build v2013 vol 13.2.5 发布
支持xe6 了,但是承诺的功能在哪里? What's New in 13.2.5 (VCL Product Line) New Major Features in 13.2 What's New ...
- 2018.08.04 spoj TTM to the moon(主席树)
spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...
- js数组合并(一个数组添加到另一个数组里面)方法
js定义两个数组. var arrA=[1,2,3]; var arrB=[4,5,6]; 要实现[1,2,3,4,5,6],如果直接arrA.push(arrB); 则arrB只会作为了arrA的一 ...
- 命令行生成war包
1.找到自己的代码位置 2.进入cmd界面 3.进入对应的目录 4.执行命令 5.就会开始自动打包 6.在文件夹下生成对应的war包
- linux上安装tomcat
这里采用离线解压tar.gz的方式安装 下载: wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.33/bin/apache-tomc ...
- Python 运行 Python hello.py 出错,提示: File "<stdin>" , line 1
写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...
- 关于iOS的自动弹出键盘问题
-(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.textField beco ...
- 类之间关系理解:组合>聚合>关联>依赖;实现,继承
类之间关系理解:组合>聚合>关联>依赖:实现,继承 1. 从类之间的关系来看,不外乎以下几种 组合>聚合>关联>依赖:实现,继承 且可以分为以下两类: (1)实现, ...
- sqlserver错误2,error 40
打开配置管理器:开始-> sqlserver2014->配置工具->配置管理器 选择sqlserver服务,并将右侧箭头的指向右击设为启动就OK了
- BitAdminCore框架更新日志20180523
20180523更新内容 本次更新两个内容,一是增加视频处理功能,二是增加定时服务功能. 视频处理 定时服务 BitAdminCore框架,用最少的代码,实现最多的功能 本次新暂未发布,后续有空发布 ...