java中的close in/outputstream

zyfwsgd6  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(302)

如您所见,我确实关闭了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()}。。。这有必要吗?

tag5nh1u

tag5nh1u1#

您可以对资源使用try并取消显式的close调用,例如

public void writeData(final List<Sinhvein> svList){
    try(final FileOutputStream fo = new FileOutputStream(datasv); final ObjectOutputStream oo = new ObjectOutputStream(fo);){
    // do something with fo and oo
    }
}

对资源进行一次尝试的全部目的是避免显式finally块,这些块负责清理。

bqf10yzr

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);
因此:

public void writedata(List<sinhvien> svlist) throws IOException {
    try (var fo = new FileOutputStream(datasv);
         var oo = new ObjectOutputStream(fo)) {

        oo.writeObject(svlist);
    }
}

数量级是否更好:
它没有缓存问题
它更容易阅读和理解
一个名为'writedata'的方法显然可以以另一种方式退出:嗯,哎呀,我正在保存它的i/o系统出现问题。方法应该抛出看起来很明显的内容,而ioexception在这里很明显。
当保存数据失败时,不会自动执行任何操作。

相关问题