在所有例子中,每个人都可以找到这样的代码:
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()
时。当输入数据异常抛出时,此操作是否自动执行?因为如果程序有输入问题,这意味着流已经打开。
答案 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 ---");
}