java9版本特性资源自动关闭的语法增强

目录

我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右。

java9第一篇-可以在interface中定义私有方法了

在Java 9的版本中,对从JDK 7开始支持的try-with-resources语法进行了改进。虽然只是一个小小的改进,我仍希望把他介绍给你,我们一起来每天进步一点点。

一、先说Java7的try-with-resources(Java9改进版在后文)

在Java 7之前没有try-with-resources语法,所有的流的销毁动作,全都需要自己在finally方法中手动的写代码进行关闭。如下文中的代码,将一个字符串写入到一个文件里面。

@Testvoid testStream() throws IOException {  String fileName = "D:\\data\\test\\testStream.txt";  FileOutputStream fos = new FileOutputStream(fileName);  //创建IO管道流  OutputStreamWriter osw = new OutputStreamWriter(fos);  BufferedWriter bw = new BufferedWriter(osw);  try{    bw.write("手写代码进行Stream流的关闭");    bw.flush();  }finally{    bw.close();   //手动关闭IO管道流    osw.close();    fos.close();  }}

从Java 7版本开始提供了try-with-resources语法,我们只需要把管道流用try()包含起来,在try代码段执行完成之后,IO管道流就会自动的关闭,不需要我们手写代码去关闭,这很简洁!

@Testvoid testTry() throws IOException {  String fileName = "D:\\data\\test\\testTry.txt";  try(FileOutputStream fos = new FileOutputStream(fileName);      OutputStreamWriter osw = new OutputStreamWriter(fos);      BufferedWriter bw = new BufferedWriter(osw);){    bw.write("IO管道流被自动调用close()方法");    bw.flush();  }}

二、避免走入误区

很多小伙伴在知道try-with-resources语法之后,容易陷入误区

误区一:只有IO管道流才能使用try-with-resources语法,进行自动的资源关闭误区二:所有带有close()方法的类对象,都会自动的调用close()方法进行资源关闭

误区一把实践范围缩小了,而误区二把实践范围夸大了。那么什么样的资源可以被自动关闭呢?答案就是实现了AutoCloseable或Closeable接口的类可以自动的进行资源关闭。

public interface Closeable extends AutoCloseable {    public void close() throws IOException;}

Closeable接口继承自AutoCloseable接口,二者都包含close()方法。如果你自定义的占用系统资源的类需要进行资源回收,请实现这两个接口之一,并在close()方法中进行资源回收与关闭。这样你自定义的类,也可以使用try-with-resources语法进行资源回收与关闭。

三、try-with-resources在Java 9中的改进

try-with-resources语法在java 9 中进行了改进,try-with-resources语法的try()可以包含变量,多个变量用分号隔开。 这样的改进目的是让语义更加明确,将资源创建代码与尝试资源回收的语法分离。

语义一:尝试去执行代码段,如果抛出异常,对异常进行处理语义二:尝试去自动关闭资源,关闭谁?关闭被try()包含的变量

@Testvoid testJava9Try() throws IOException {  String fileName = "D:\\data\\test\\testJava9Try.txt";  FileOutputStream fos = new FileOutputStream(fileName);  OutputStreamWriter osw = new OutputStreamWriter(fos);  BufferedWriter bw = new BufferedWriter(osw);  try(bw;osw;fos){  //注意这里:尝试去回收这三个对象对应的资源,和上文中的java 7代码对比    bw.write("Java9-可以被自动调用close()方法");    bw.flush();  }}

欢迎关注我的博客,里面有很多精品合集 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

(0)

相关推荐

  • java9学习笔记之模块化详解

    前言 截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 模块化的功能有几个目的: 让Java的SE程序更加容易轻量级部署 改进组件间的依赖管理,引入比Jar粒度更大的Module 改进性能和安全性 如果用更加简单解释,那就是"解决Classpath地狱问题,改进部署能力".Module的内容比较多,为了由浅入深,我按照一些问题和我的理解来介绍模块化. 一.

  • java9开始——接口中可以定义private私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开始,Interface 接口中允许定义私有方法和私有静态方法.下面我们就来为大家介绍其语法规则,和为什么要有这样的设计. 其实在Java 8之前,还有另一个被广为人之的知识点:接口中所有的方法必须是abstract 抽象方法.但是,从java 8开始接口中可以包含非abstract 方法,如下文中的

  • Java9的一些新特性介绍

    被接受的特性 1. Jigsaw 项目;模块化源码 Jigsaw项目是为了模块化Java代码.将JRE分成可相互协作的组件,这也是Java 9 众多特色种的一个.JEP是迈向Jigsaw四步中的第一步,它不会改变JRE和JDK的真实结构.JEP是为了模块化JDK源代码,让编译系统能够模块编译并在构建时检查模块边界.这个项目原本是随Java 8发布的,但由于推迟,所以将把它加到Java 9. 一旦它完成,它可能允许根据一个项目需求自定义组件从而减少rt.jar的大小.在JDK 7 和JDK 8的r

  • Java9 集合工厂方法解析

    目录 使集合框架更便捷的工厂方法 集合框架增加工厂方法是必然的结果 早先的使用过程如下 也不得不提一下下面这些单语句表达式 下面是其原始类型的简明表达方式 一起来看看集合工厂方法 以下工厂方法已添加到List接口中 以下工厂方法已添加到Set接口中 以下是List和Set的示例 以下工厂方法则添加到Map接口中 下面是Map的ofEntries() 和entry()方法的示例 使集合框架更便捷的工厂方法 JEP269中提议,为集合框架增添一些工厂方法,来使创建不可变集合类与含有少量元素的Map变

  • 深入讲解Java 9中的九个新特性

    本文主要跟大家分享了Java 9中的九个新特性,对大家具有一定的参考学习价值,下面来看看详细的介绍: 一. Java 平台级模块系统 Java 9 的定义功能是一套全新的模块系统.当代码库越来越大,创建复杂,盘根错节的"意大利面条式代码"的几率呈指数级的增长.这时候就得面对两个基础的问题: 很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念.每一个公共类都可以被类路径之下任何其它的公共类所访问到, 这样就会导致无意中使用了并不想被公开

  • java9版本特性资源自动关闭的语法增强

    目录 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右. java9第一篇-可以在interface中定义私有方法了 在Java 9的版本中,对从JDK 7开始支持的try-with-resources语法进行了改进.虽然只是一个小小的改进,我仍希望把他介绍给你,我们一起来每天进步一点点. 一.先说Java7的try

  • java9新特性Collection集合类的增强与优化方法示例

    目录 一.提供of()方法创建集合 1.1.构建Set集合对象 1.2.构建List集合对象 1.3.构建Map对象 1.4.使用Map.ofEntries()和Map.entry() 二.Arrays 2.1.Arrays.mismatch() 2.2.Arrays.equals() 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的

  • Java9新特性Stream流API优化与增强

    目录 1.Stream.takeWhile(Predicate) 2.Stream.dropWhile(Predicate) 3.StreamStream.iterate(T,Predicate,UnaryOperator) 4.StreamStream.ofNullable(T) 5.IntStream,LongStream和DoubleStream方法 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还

  • Java9新特性Java.util.Optional优化与增强解析

    目录 一.Java9的ifPresentOrElse(Consumer,Runnable) 1.1.Java9中的增强 1.2.回顾一下Java8中的写法 二.Java9的Optional.or(Supplier) 三.Java9的Optional.stream() 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,

  • Java9新特性对HTTP2协议支持与非阻塞HTTP API

    目录 一.HTTP/2简介 HTTP/2数据推送 目前支持 HTTP/2 的 Java HTTP 客户端 二.Java 9 的 HTTP/2 客户端 在阻塞模式下发送请求 以非阻塞模式发送请求(Java 9) 三.支持HTTP2的Push-Promise Frames 在HTTP/1.1 发布了16 年之后,IETF在2015年终于通过了HTTP/2 协议.HTTP/2协议旨在降低延迟,满足当今时代对于信息响应时间的要求.在这篇文章中,我会简要的对HTTP/2协议进行介绍,然后我们将重点放在研究

  • Java9版本新特性同一个Jar支持多JDK版本运行

    目录 一.基本使用方法 二.真实的例子 java8代码 Java9代码 编译 运行Mainclass 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右. java9第一篇-可以在interface中定义私有方法了java9第二篇-Java9改进try-with-resources语法 本文内容:在Java 9增强了J

  • java9新特性Reactive Stream响应式编程 API

    目录 一.Java9ReactiveStreamAPI 二.Java响应式编程四大接口 2.1.SubscriberInterface(订阅者订阅接口) 2.2.SubscriptionInterface(订阅令牌接口) 2.3.PublisherInterface(发布者接口) 2.4.ProcessorInterface(处理器接口) 二.实战案例 实现订阅者SubscriberInterface SubmissionPublisher消息发布者 我计划在后续的一段时间内,写一系列关于jav

  • Java9新特性对HTTP2协议支持与非阻塞HTTP API

    目录 一.HTTP/2简介 HTTP/2数据推送 目前支持HTTP/2的JavaHTTP客户端 二.Java9的HTTP/2客户端 在阻塞模式下发送请求 以非阻塞模式发送请求(Java9) 三.支持HTTP2的Push-PromiseFrames 在HTTP/1.1 发布了16 年之后,IETF在2015年终于通过了HTTP/2 协议.HTTP/2协议旨在降低延迟,满足当今时代对于信息响应时间的要求.在这篇文章中,我会简要的对HTTP/2协议进行介绍,然后我们将重点放在研究Java9中对HTTP

  • Java9新特性Module模块化编程示例演绎

    目录 一.什么是Javamodule? 二.模块导出package 三.模块导入package 四.Javamodule的意义 五.实例 第一个模块 第二个模块 尝试使用未被exports的package代码 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第8篇. 在Java 9版本中Java 语言引入了一

  • java9新特性Reactive Stream响应式编程 API

    目录 一.Java9ReactiveStreamAPI 二.Java响应式编程四大接口 2.1.SubscriberInterface(订阅者订阅接口) 2.2.SubscriptionInterface(订阅令牌接口) 2.3.PublisherInterface(发布者接口) 2.4.ProcessorInterface(处理器接口) 二.实战案例 实现订阅者SubscriberInterface SubmissionPublisher消息发布者 我计划在后续的一段时间内,写一系列关于jav

随机推荐