1

在所有示例中,每个人都可以找到如下代码:

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()。当输入数据异常抛出时,此操作会自动执行吗?因为如果程序输入有问题,这意味着流已经打开。

4

3 回答 3

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();
}
于 2013-01-16T20:11:42.207 回答
2

不,关闭操作不会自动调用。try-with-resources为此,Java 7 中引入了以下用途:

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

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

于 2013-01-16T20:12:50.770 回答
2

即使文件未找到异常发生蒸汽是打开的,你也只需要再次关闭它。

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

 finally {
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    //do something clever with the exception
                }
            }
            System.out.println("--- File End ---");
        }
于 2013-01-16T20:14:13.493 回答