如果IOException,关闭流的DataInputStream

时间:2013-01-16 20:10:01

标签: java datainputstream

在所有例子中,每个人都可以找到这样的代码:

DataInputStream inputStream = null;
try {
    inputStream = new DataInputStream( new FileInputStream("file.data"));
    int i = inputStream.readInt();
    inputStream.close();
} catch (FileNotFoundException e) { 
    //print message File not found
} catch (IOException e) { e.printStackTrace() }

当此代码遇到FileNotFound异常时,inputStream未打开,因此无需关闭。

但是为什么当IOException在那个catch块中我没有看到inputStream.close()时。当输入数据异常抛出时,此操作是否自动执行?因为如果程序有输入问题,这意味着流已经打开。

3 个答案:

答案 0 :(得分:2)

DataInputStream inputStream = null;
try {
    inputStream = new DataInputStream( new FileInputStream("file.data"));
    int i = inputStream.readInt();
} catch (FileNotFoundException e) { 
  //print message File not found
} catch (IOException e) { 
  e.printStackTrace();
} finally{
  if(null!=inputStream)
    inputStream.close();
}

答案 1 :(得分:2)

不,关闭操作不会自动调用。为此,请使用Java 7中引入的try-with-resources

try (DataInputStream inputStream = new DataInputStream( new FileInputStream("file.data"))) {
    int i = inputStream.readInt();
} catch (Exception e) { e.printStackTrace() }      

UPD:说明:DataInputStream实现AutoCloseable接口。这意味着,在构造try-with-resources中,Java会自动调用隐藏的finally块中的close() inputStream方法。

答案 2 :(得分:2)

即使发现文件未找到异常,蒸汽也会打开,您只需要再次关闭它。

您应该始终在try catch中添加finally块并关闭流。如果存在异常,最后将始终执行

 finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    //do something clever with the exception
                }
            }
            System.out.println("--- File End ---");
        }