IO资源处理
对于IO资源来说,是使用完成之后一定要记住需要将其进行释放。因为这些资源是属于操作系统层面的资源。
1. jdk1.6以及以前的异常处理方式
步骤
- 为了保证流一定能关, 将关流的代码放到finally中
- 为了解决作用域的问题, 把流创建的语句拿到try的上面
- 为了解决局部变量使用前初始化的问题, 把两个流先赋值成null
- 为了防止空指针异常, 对这两个关流的操作进行非空判断
- close方法依然后异常出现, 所以可以单独try-catch(将第二个close的代码放到第一个close中的finally中)
public class Demo01 {
public static void main(String[] args) {
// 局部变量在使用前必须赋值(初始化)
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("day13-code//aaa.txt");
fos = new FileOutputStream("day13-code//copyAaa.txt");
int b; // 用来记录每次读取的字节
while ((b = fis.read()) != -1) {
fos.write(b);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// inn + enter
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
上面的操作方式太过于麻烦,但是又不得不去写。
2. jdk1.7的异常处理方式
public class Demo02 {
public static void main(String[] args) {
// try-with-resources
try (
// 创建流的代码
FileInputStream fis = new FileInputStream("day13-code//aaa.txt");
FileOutputStream fos = new FileOutputStream("day13-code//copyAaa.txt");
) {
// 拷贝的代码
int b; // 用来记录每次读取的字节
while ((b = fis.read()) != -1) {
fos.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种是专门来针对实现了Closeable接口的IO类,从这里可以看到如果使用try-with-resource之后,流的关闭,异常之类的都不需要我们来做处理了。非常方便。
3、测试try-with-resources
在JDK7的时候,新增了一个接口AutoCloseable,在try()中来写有关IO资源的代码,最终会来自动关闭对应的流的资源。
看一下对应的测试代码:
public class TestOne {
/**
* 这里就相当于是自动实现了AutoCloseable接口
*/
static class MyIO implements Closeable{
@Override
public void close() throws IOException {
System.out.println("这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源11111111111");
}
}
static class MyIO1 implements Closeable{
@Override
public void close() throws IOException {
System.out.println("这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源2222222222222");
}
}
public static void main(String[] args) {
/**
* 自动提示,应该是AutoClosable接口类型的
*
* 如果有几个流资源不是连续的,那么又该如何来进行操作?
*
* 无论是哪个操作,涉及到IO资源的,都一定要考虑到各种情况来保证最终将其关闭
*
*/
try (MyIO myIO = new MyIO();
MyIO1 myIO1 = new MyIO1();
// TestOne testOne = new TestOne();
){
System.out.println("正常执行逻辑");
}catch (Exception exception){
System.out.println("执行代码异常");
}
System.out.println("继续向下进行执行");
}
}
通过控制台打印:
正常执行逻辑
这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源2222222222222
这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源11111111111
继续向下进行执行
正常情况打印
通过打印可以看到,先开的流要后关。
通过打印可以看到,先开的流要后关。
通过打印可以看到,先开的流要后关。
异常情况
这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源2222222222222
这个close相当于是给JVM的一个标识,在使用完成之后JVM会自动的关闭资源11111111111
执行代码异常
继续向下进行执行
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/277285.html