java 中IO关闭流

public class Test_01 {

public static void main(String[] args) {
    FileInputStream fis=null;
    try {
       fis=new FileInputStream("D:\\workspace\\TestIO\\src\\TestTO_01\\TestFile.java");
       byte[] buf=new byte[1024];
       int c=0;
       try {
        while((c=fis.read(buf))>=0){
            System.out.write(buf);
           }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    finally{
        [color=red]if(fis!=null)[/color]{
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

}

红色的这个地方不能理解 fis不等于空? 然后又调用close来关闭这个流
假设fis等于空怎么办? 求解!

你把文件路径:D:\workspace\TestIO\src\TestTO_01\TestFile.java改为一个不存在的路径,即:D:\workspace\TestIO\src\TestTO_01\TestFile111.java
然后执行这段代码,你就会发现程序抛出:FileNotFoundException这个异常,但此时fis为null,而你的finally里面如果不对fis判断是否为空,则会抛出java.lang.NullPointerException异常。所以需要你在close之前,再增加判断语句:if(fis!=null)

这里主要是确保释放资源的问题,这里fis不可能为空的,要是为空的话,则说明文件读取不到,也就是会IOException,结果可能是文件读取不到或者是其它问题导致的。程序根本不会执行的。

不理解你为什么会不理解?

finally这里就是要确保流能够被正确关闭。

有两种可能

  1. fis打开了即非空,那么就必须关闭。

  2. fis根本就没打开即为null,那么就可以无视了。

if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}

不加也无所谓 加上的目的是如果打开时出问题 此时为null 就没必要再让它抛空指针了 性能比没有判断要好点

首先 ,你的代码有问题。
因为FileNotFoundException继承了IOException,所以catch (FileNotFoundException e)
应该在catch (IOException e) 前。

其次,fis == null 的情况是在 运行到
new FileInputStream("D:\workspace\TestIO\src\TestTO_01\TestFile.java")
时发生 FileNotFoundException。
这样fis就没有被赋值。

这时,如果finally块中直接执行fis.close,就会出现NullException

如果是运行到 fis.read时,抛出IOException,则 null != fis。