我第一次使用FileInputStream
并尝试从文件中加载对象(Item
)。
这是我的代码:
try {
FileInputStream fi = new FileInputStream(f);
ObjectInputStream reader = new ObjectInputStream(fi);
while (true) {
Item i = (Item)reader.readObject();
System.out.println(i.getName());
}
} catch (Exception e) {
System.out.println(e.toString());
}
我已经读过这是执行此操作的标准方法,并且代码运行正常。但是,这样fi
和reader
永远不会关闭,因为只要抛出catch
,编译器就会跳转到EOFException
块。
编译器不允许我关闭fi
或reader
块中的catch
和finally
。这真的是它应该是怎样的吗?如何正确关闭输入对象?
答案 0 :(得分:5)
您可以使用try-with-resources语句,如下所示:
try (FileInputStream fi = new FileInputStream(f);
ObjectInputStream reader = new ObjectInputStream(fi)) {
while (true) {
Item i = (Item)reader.readObject();
System.out.println(i.getName());
}
} catch (Exception e) {
System.out.println(e.toString());
}
以下documentation了解有关此方法的更多信息。
答案 1 :(得分:1)
使用try with resources statement
:
try(FileInputStream fi = new FileInputStream(f)){
try(ObjectInputStream oi = new ObjectInputStream(fi)){
// your code
}
}
这样,您的输入流在任何情况下都会关闭。无论例外如何
答案 2 :(得分:1)
感谢范围界定的工作方式,您希望这样做,您尝试将新的try
/ finally
与每个Stream
相关联:
try {
FileInputStream fi = new FileInputStream(f);
try {
ObjectInputStream reader = new ObjectInputStream(fi);
try {
while (true) {
Item i = (Item)reader.readObject();
System.out.println(i.getName());
}
} finally {
reader.close();
}
} finally {
fi.close();
}
} catch (Exception e) {
System.out.println(e.toString());
}
但是在最新版本的java(使用try-with-resources)中你可以这样做,实际上:
try (FileInputStream fi = new FileInputStream(f),
ObjectInputStream reader = new ObjectInputStream(fi)) {
while (true) {
Item i = (Item)reader.readObject();
System.out.println(i.getName());
}
} catch (Exception e) {
System.out.println(e.toString());
}
编译将基本上将其转换为第一个版本。