CSDNRGY 2017-02-22 04:35 采纳率: 87.5%
浏览 2657
已采纳

为什么要使用finally关闭对象?

感觉finally会让代码变得很难看,如果不用,会带来什么后果

下面是代码,f1比f2清爽了不少

    public static void f1(File in, File out) throws IOException {
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        int maxCount = (64 * 1024 * 1024) - (32 * 1024);
        long size = inChannel.size();
        long position = 0;
        while (position < size) {
            position += inChannel.transferTo(position, maxCount, outChannel);
        }
        if (inChannel != null) inChannel.close();
        if (outChannel != null) outChannel.close();
    }

    public static void f2(File in, File out) throws IOException {
        FileChannel inChannel = new FileInputStream(in).getChannel();
        FileChannel outChannel = new FileOutputStream(out).getChannel();
        try {
            int maxCount = (64 * 1024 * 1024) - (32 * 1024);
            long size = inChannel.size();
            long position = 0;
            while (position < size) {
                position += inChannel.transferTo(position, maxCount, outChannel);
            }
        } finally {
            if (inChannel != null) {
                inChannel.close();
            }
            if (outChannel != null) {
                outChannel.close();
            }
        }
    }
  • 写回答

9条回答 默认 最新

  • little_how 2017-02-22 06:02
    关注

    finally就是防止在出现io异常时,流关闭不上的事情,每个操作系统都有个最大的打开文件数,超过的话,系统就会崩溃;
    当然了sql也是一样的,只要是资源,在jdk之前都只能用finally;

    在jdk1.7之后,有一个更优雅的实现方式,但是也是有try..catch语句块的,只是没有了finally
    如:
    try (InputStream in = new FileInputStream("your file name")) {
    //正常业务处理
    } catch(Exception e) {
    //异常处理
    }
    在语句执行完后,会自动调用in的close方法进行关闭;

    资源是一个很严谨的东西,所以一定要把它当成大事来对待;否者程序的可用性会大大降低;

    希望对你有所帮助...

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能