如何正确关闭 ObjectInputStream?
How to close ObjectInputStream properly?
我是第一次使用 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
永远不会关闭,因为一旦 EOFException
被抛出,编译器就会跳转到 catch
块。
编译器不允许我关闭 catch
或 finally
块中的 fi
和 reader
。这真的应该是这样吗?如何正确关闭输入对象?
使用try with resources statement
:
try(FileInputStream fi = new FileInputStream(f)){
try(ObjectInputStream oi = new ObjectInputStream(fi)){
// your code
}
}
这样你的输入流在任何情况下都是关闭的。无一例外
您可以使用 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了解有关此方法的更多信息。
由于作用域的工作原理,您想这样做,尝试将新的 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());
}
并且编译基本上会将其转换为第一个版本。
我是第一次使用 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
永远不会关闭,因为一旦 EOFException
被抛出,编译器就会跳转到 catch
块。
编译器不允许我关闭 catch
或 finally
块中的 fi
和 reader
。这真的应该是这样吗?如何正确关闭输入对象?
使用try with resources statement
:
try(FileInputStream fi = new FileInputStream(f)){
try(ObjectInputStream oi = new ObjectInputStream(fi)){
// your code
}
}
这样你的输入流在任何情况下都是关闭的。无一例外
您可以使用 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了解有关此方法的更多信息。
由于作用域的工作原理,您想这样做,尝试将新的 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());
}
并且编译基本上会将其转换为第一个版本。