java中try-catch模块中with语句块的作用

以前写try-catch时,遇到一些流、连接等对象,必定需要添加finally语句来关闭这些对象。
今天突然发现try的with模块可以省略在finally手动关闭的动作,可以通过将这些
对象定义在with模块中,然后在try语句完成后,自动close对象,前提需要该对象
实现了AutoCloseableCloseable接口。
然后发现,这个特性其实在java7中就引入了,现在都java9了,才发现。很落伍啊!!!
例如现在的写法:

try (BufferedInputStream bis = new BufferedInputStream(is);
             BufferedOutputStream bos = new BufferedOutputStream(
                     new FileOutputStream(file));) {
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
                bos.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
}

这样就够了,但是以前得多个finally,并且对象定义还得放到try的前面:

BufferedInputStream bis =  null;
BufferedOutputStream bos = null;
try  {
      bis = new BufferedInputStream(is);
      bos = new BufferedOutputStream(new FileOutputStream(file));
      byte[] buffer = new byte[1024];
      int len = -1;
      while ((len = bis.read(buffer)) != -1) {
           bos.write(buffer, 0, len);
           bos.flush();
       }
} catch (IOException e) {
      e.printStackTrace();
}finally{
         if(null!=bis){
                    bis.close();
            }
            if(null!=bos){
                    bos.close();
        }
}

原文地址:http://blog.51cto.com/yuqian2203/2135282

时间: 2024-08-01 21:57:10

java中try-catch模块中with语句块的作用的相关文章

阿里规范 - 六、工程结构 - (二)二方库依赖 - 9. 【推荐】所有 pom 文件中的依赖声明放在<dependencies>语句块中,所有版本仲裁放在 <dependencyManagement>语句块中。

9. [推荐]所有 pom 文件中的依赖声明放在<dependencies>语句块中,所有版本仲裁放在 <dependencyManagement>语句块中. 说明:<dependencyManagement>里只是声明版本,并不实现引入,因此子项目需要显式的声明依 赖,version 和 scope 都读取自父 pom.而<dependencies>所有声明在主 pom 的<dependencies>里 的依赖都会自动引入,并默认被所有的子项目

java多线程(三)——锁机制synchronized(同步语句块)

用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法之行一个长时间的任务,那么B线程必须等待比较长的时间,在这样的情况下可以使用synchronized同步语句快来解决. 一.用同步代码块解决同步方法的弊端 Task类 1 package com.weishiyao.learn.day4.testSynchorized.ep2; 2 3 public class Task { 4 5 private String getData1; 6 private Stri

java 抛出异常与finally的混用对于语句块的执行顺序的影响

代码如下: 1 package test1; 2 3 public class EmbededFinally { 4 5 6 public static void main(String args[]) { 7 8 int result; 9 10 try { 11 12 System.out.println("in Level 1"); 13 14 15 try { 16 17 System.out.println("in Level 2"); 18 // res

关于 Java 中 finally 语句块的深度辨析

可不能小看这个简单的 finally,看似简单的问题背后,却隐藏了无数的玄机.接下来我就带您一步一步的揭开这个 finally 的神秘面纱. 问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子. 清单 1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1

os模块中关于文件/目录常用的函数使用方法

函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当前目录,'..'表示上一级目录) mkdir(path) 创建单层目录,如该目录已存在抛出异常 makedirs(path) 递归创建多层目录,如该目录已存在抛出异常,注意:'E:\\a\\b'和'E:\\a\\c'并不会冲突 remove(path) 删除文件 rmdir(path) 删除单层目录,如该目录非空则抛出异常 remov

Javascript中作用域的修改以及with语句

背景 问题来自看JavaScript高级程序设计遇到了延长作用域的问题.不能理解文中解释的内容,于是网上查到一些相关文章. 首先需要了解的是,JavaScript中执行环境一共有两种:全局作用域和局部作用域.而在浏览器中.全局作用域是Windows对象.自下而上,局部作用域可以访问全局作用域(如果在子作用域中没有找到的话).反之则不可以. 但是使用with则可以起到延长作用域的作用. 摘抄相关文章 文章一 关于Javascript静态作用域的一些心得. 之前在看JS大牛BYVoid的<<Nod

Finally语句块的运行

一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验.至少下面有两种情况下finally语句是不会被运行的: (1)异常捕获机制finally块与try和catch块是关联的.既然是关联的假设try...catch...finally语句逻辑上达不到没有被运行,如在try语句之前就返回了,这样finally语句就不会运行,这也说明了finally语句被

Finally语句块的执行

一.finally语句块是否一定执行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验验,至少以下有两种情况下finally语句是不会被执行的: (1).异常捕获机制finally块与try和catch块是关联的,既然是关联的如果try...catch...finally语句逻辑上达不到没有被 执行,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语

浅谈 js 语句块与标签

原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象字面量么?怎么成了语句块了?如果在赋值语句或者表达式里用的时候,确实是对象字面量,如: var a = {}; ({toString:function(){return "hehe"}}) + "..."; 是不是很有意思..但是直接使用如: {toString: fu