IOException的故事
1. 什么是IOException
这个你可以看看API
http://download.oracle.com/javase/6/docs/api/java/io/IOException.html
2. 广泛的说,什么时候会有IOException
比如你文件都不到的时候
你在做数据库操作的时候数据库底层出现问题
或者你系统IO出问题了
系统拿不到文件句柄
你说的读着读着突然被删了,你可以试试,书不定真可以
你可以看有多少IOExeption个子类,差不多就有多少种类型
3. 为什么我要捕获IOExeption
为什么要有checked exception,这个是java设计的问题,暂不深究
但是这个IOException的意思就是告诉你,万一你在做io操作的时候出现异常怎么办
最简单的例子是,我
Class clazz = Class.forname("/path/to/class");
这个时候万一找不到这个class文件该怎么办,也算提醒程序员极有可能出现问题的地方,这里不能忽略
还有一个例子是
try {
stream.close()
} catch(IOException e) {
// ignore
}
你可以看到这里我们的IOException是忽略的,因为关闭不了,我们也没办法 -_-!!!
io流异常。看看是不是文件名对不对,路径对不对。
情况多了 IOException是一个错误的大类,
下面还有各种错误小类ClosedChannelException,FileNotFoundException, FilerException, FileSystemException, HttpRetryException, IIOException....等等
你得列出详细情况才能知道到底是怎么回事
如下例子代码:
FileInputStream is = new FileInputStream(".");
BufferedInputStream bis = new BufferedInputStream(is);
bis.close();
从设计模式上看:
java.io.BufferedInputStream是java.io.InputStream的装饰类。
BufferedInputStream装饰一个 InputStream 使之具有缓冲功能,is要关闭只需要调用最终被装饰出的对象的 close()方法即可,因为它最终会调用真正数据源对象的 close()方法。
BufferedInputStream的close方法中对InputStream进行了关闭,下面是jdk中附带的源代码:
java.io.BufferedInputStream的api:
close
public void close()throws IOException 关闭此输入流并释放与该流关联的所有系统资源。
因此,可以只调用外层流的close方法关闭其装饰的内层流,验证例子:
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
bw.close();
}
验证ok