如您所见,我确实关闭了fo和oo,所以在那之后我需要关闭outputstream吗
public void writedata(List<sinhvien> svlist) {
FileOutputStream fo = null;
ObjectOutputStream oo = null;
try {
fo = new FileOutputStream(datasv);
oo = new ObjectOutputStream (fo);
oo.writeObject(svlist);
}
catch (IOException e) {}
finally {
try {
fo.close();
oo.close();
}
catch (IOException e ) {}
}
}
比如:。。。outputstreamosif(操作系统!=null)尝试{os.close()}。。。这有必要吗?
2条答案
按热度按时间tag5nh1u1#
您可以对资源使用try并取消显式的close调用,例如
对资源进行一次尝试的全部目的是避免显式finally块,这些块负责清理。
bqf10yzr2#
你做的顺序不对。
允许流缓冲。通过关闭底层流(
fo
)首先,如果oo
缓冲,你的代码失败。你也吃任何异常,这显然是一个非常糟糕的想法:如果你的代码失败了(例如oo
close抛出一个异常,报告它无法写出最后几个字节,因为fo已经关闭,您永远不会知道,现在您有一个损坏的文件,并且不知道它已损坏。你可以关门
oo
但问题是,如果oo = new ObjectOutputStream(fo)
失败?你还是得关门fo
那么。经验教训:
您必须按堆栈顺序关闭打开的每个资源(您最后做的事情需要先关闭)。
永远不要写一个空的catch块,除非你真的,真的,真的知道你在做什么。
运用这些经验教训的最佳方法:
对资源使用try
随意乱扔垃圾
throws IOException
你的签名上也有类似的东西。你的main
应声明为throws Exception
. 在不可行或不可能的情况下,正确的“我不知道发生了什么”catch块是:`catch(thingie e){throw new runtimeexception(“uncaught”,e);因此:
数量级是否更好:
它没有缓存问题
它更容易阅读和理解
一个名为'writedata'的方法显然可以以另一种方式退出:嗯,哎呀,我正在保存它的i/o系统出现问题。方法应该抛出看起来很明显的内容,而ioexception在这里很明显。
当保存数据失败时,不会自动执行任何操作。