想要查看此教程的目录请点击:Java IO教程目录贴地址
Streams或Readers/Writers在使用过程中需要是可关闭的。这需要调用close()方法。这需要一点儿思考,看下面的代码:
InputStream input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();
while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = input.read();
}
input.close();
这段代码看起来很好。但是如果doSomethingWithData()方法抛出异常会发生什么?对的!如果发生异常InputStream就不会被关闭了!
下面的代码避免了这样的问题:
InputStream input = null;
try{
input = new FileInputStream("c:\\data\\input-text.txt");
int data = input.read();
while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = input.read();
}
}catch(IOException e){
//do something with e... log, perhaps rethrow etc.
} finally {
if(input != null) input.close();
}
注意一下现在InputStream是怎么样在finally下关闭的。不管在try代码块中发生了什么,finally中的代码都会被执行。所以InputStream总是会被关闭。
但是close()方法如果抛出异常会发生什么?是说stream已经被关闭了?好吧,你可能要用try-catch去catch住这个异常,像下面这样:
} finally {
try{
if(input != null) input.close();
} catch(IOException e){
//do something, or ignore.
}
}
这样嵌套的去处理问题,看起来非常丑陋,尽管解决了问题。这样不优雅的异常处理代码并不够好,他可以在你的代码中重复的传播。如果写代码时候比较匆忙,忘记异常处理该怎么办?
想象一下如果从doSomethingWithData()抛出一个异常,第一个catch捕捉到那个异常,InputStream在finally关闭。但是,如果从input.close()方法抛出一个异常会发生什么?两个异常中的哪一个应该被传播到调用堆栈?
幸运的是,有一个方法解决这个问题。解决的办法是 Exception Handling Templates in Java。创建一个异常处理模板在最后来关闭流。代码一次写完,可以在各处重用。可以在Exception Handling Templates in Java学习更多。
Java 7中Java IO 的异常处理
Java7开始有一个新的异常处理机制叫做“try with resources”,它是一个语法糖。这个异常处理机制特别的地方在于你使用资源时需要在使用后关闭,那么用它可以解决这个问题,例如使用InputStream,OutputStream时等等。想要学习和它更多相关的内容可以去Try With Resources in Java 7
.
.
网友评论