JDK1.7 新特性

1、switch支持String做参数

/***
 * switch支持字符串做参数 jdk7
 * @author huangjiawei
 */
public class SwitchTest {
 public static void switchTest(String arg) {
     switch (arg) {
      case "Lisa":
      System.err.println("我是Lisa!");
      break;
      case "Mike":
      System.err.println("我是Mike!");
      break;
      default:
      System.err.println("我是你的唯一!");
      break;
     }
 }
 public static void main(String[] args) {
     switchTest("Lisa");//我是Lisa!
     switchTest("Mike");//我是Mike!
     switchTest("");//我是你的唯一!
 }
}

 

2、数字字面量的改进

2.1. Java7 前支持 十进制(1234)、八进制(01234)、十六进制(0x1234)  

     Java 8支持二进制(0B11110001)

2.2. 可以使用下划线隔开_

public class BinaryTest {
     private static int a = 16;//十进制
     private static int b = 020;//八进制
     private static int c = 0x10;//十六进制
     private static int d = 0b0001_0000;//二进制,使用分隔符隔开
     public static void main(String[] args) {
         System.err.println(a);//16
         System.err.println(b);//16
         System.err.println(c);//16
         System.err.println(d);//16
     }
}

3、资源自动关闭

在Java中,有许多的资源在使用完成之后需要对其进行关闭操作。举个例子,InputStream,Writer,Sockets,Connection等等。在Java 7 之前通常都是显示调用其close()方法,在Java 7,你可以不用理会其是否未关闭,我们可以使用try-with-resources代码块。

import java.io.BufferedReader;
import java.io.FileReader;

public class TryTest {

    /*
     * 接受一个文件的路径 Java 7之前
     */
    public static String tryTest(String path) {

        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(path));
            return br.readLine();
        } catch (Exception e) {
            System.err.println("BufferedReader Exception" + e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                    br.ready();// 流已经关闭,此处抛出异常
                } catch (Exception e) {
                    System.err.println("BufferedReader close Exception" + e);
                }
            }
        }
        return "";
    }

    /*
     * 接受一个文件的路径 Java7
     */
    public static String tryTest1(String path) {
        /*
         * 当try语句块运行结束时,FileInputStream 会被自动关闭。这是因为FileInputStream 实现了java中的java.lang.AutoCloseable接口。 所有实现了这个接口的类都可以在try-with-resources结构中使用。
         */
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine();
        } catch (Exception e) {
            System.err.println("BufferedReader Exception" + e);
        }
        return "";
    }

    public static void main(String[] args) {
        tryTest("C:\\Users\\huangjiawei\\Desktop\\my-release-key.keystore");
        tryTest1("C:\\Users\\huangjiawei\\Desktop\\my-release-key.keystore");
    }
}

 

4、catch多个异常

Java7之前,捕获多个异常必须有多个catch子句,在Java 7,我们可以这样子写:

import java.util.Date;

/**
 * 多个catch语句永远只执行第一个匹配到的catch异常,后面有再多的catch都会被忽略掉
 */
public class CatchTest {
    /*
     * java 7以前
     */
    public static void CatchTest() {
        int a = 100;
        int b = 0;
        Date date = null;
        try {
            System.err.println(date.getTime());// 这里抛出异常,下面的语句就不会执行啦!
            int result = a / b;// 不会执行
            System.err.println(result);// 不会执行
        } catch (NullPointerException e) {
            System.err.println(e);// java.lang.NullPointerException
        } catch (ArithmeticException e) {
            System.err.println(e);
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    /*
     * java 7
     */
    public static void CatchTest1() {
        int a = 100;
        int b = 0;
        Date date = null;
        try {
            int result = a / b;
            System.err.println(result);
            System.err.println(date.getTime());
        } catch (ArithmeticException | NullPointerException e) {
            System.err.println(e);// java.lang.ArithmeticException: / by zero
        }
    }

    public static void main(String[] args) {
        CatchTest();
        CatchTest1();
    }
}

5、实例创建类型推断

import java.util.ArrayList;
import java.util.List;

public class TypeTest {

    /*
     * java 7前,前后<>都必须声明类型
     */
    List<String> list = new ArrayList<String>();

    /*
     * java 7,后<>不须声明类型,自动根据前面<>推断其类型
     */
    List<String> list1 = new ArrayList<>();
}

6、增强的文件系统

Java7 推出了全新的NIO2.0 API以此改变针对文件管理的不便,使得在java.nio.file包下使用Path、Paths、Files、WatchService、FileSystem等常用类型可以很好的简化开发人员对文件管理的编码工作。

6.1 Path接口和Paths类

Path接口的某些功能其实可以和java.io包下的File类等价,当然这些功能仅限于只读操作。在实际开发过程中,开发人员可以联用Path接口和Paths类,从而获取文件的一系列上下文信息。

  • int getNameCount(): 获取当前文件节点数
  • Path getFileName(): 获取当前文件名称
  • Path getRoot(): 获取当前文件根目录
  • Path getParent(): 获取当前文件上级关联目录

联用Path接口和Paths类型获取文件信息:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathPathsTest {
    public static void main(String[] args) {
        Path path = Paths.get("C:\\\\Users\\\\huangjiawei\\\\Desktop\\\\my-release-key.keystore");
        System.out.println("文件节点数:" + path.getNameCount()); // 文件节点数:4
        System.out.println("文件名称:" + path.getFileName()); // 文件名称:my-release-key.keystore
        System.out.println("文件根目录:" + path.getRoot()); // 文件根目录:C:\
        System.out.println("文件上级关联目录:" + path.getParent());// 文件上级关联目录:C:\Users\huangjiawei\Desktop
    }
}

6.2. Files类

联用Path接口和Paths类可以很方便的访问到目标文件的上下文信息。当然这些操作全都是只读的,如果开发人员想对文件进行其它非只读操作,比如文件的创建、修改、删除等操作,则可以使用Files类型进行操作。
Files类型常用方法如下:

  • Path createFile(): 在指定的目标目录创建新文件
  • void delete(): 删除指定目标路径的文件或文件夹
  • Path copy(): 将指定目标路径的文件拷贝到另一个文件中
  • Path move(): 将指定目标路径的文件转移到其他路径下,并删除源文件

使用Files类型复制、粘贴文件示例:

Files.copy(Paths.get("/test/src.xml"), Paths.get("/test/target.xml"));

使用Files类型来管理文件,相对于传统的I/O方式来说更加方便和简单。因为具体的操作实现将全部移交给NIO2.0 API,开发人员则无需关注。

6.3. WatchService

Java7 还为开发人员提供了一套全新的文件系统功能,那就是文件监测。在此或许有很多朋友并不知晓文件监测有何意义及目,那么请大家回想下调试成热发布功能后的Web容器。当项目迭代后并重新部署时,开发人员无需对其进行手动重启,因为Web容器一旦监测到文件发生改变后,便会自动去适应这些“变化”并重新进行内部装载。Web容器的热发布功能同样也是基于文件监测功能,所以不得不承认,文件监测功能的出现对于Java文件系统来说是具有重大意义的。
文件监测是基于事件驱动的,事件触发是作为监测的先决条件。开发人员可以使用java.nio.file包下的StandardWatchEventKinds类型提供的3种字面常量来定义监测事件类型,值得注意的是监测事件需要和WatchService实例一起进行注册。

StandardWatchEventKinds类型提供的监测事件:

  • ENTRY_CREATE:文件或文件夹新建事件;
  • ENTRY_DELETE:文件或文件夹删除事件;
  • ENTRY_MODIFY:文件或文件夹粘贴事件;

使用WatchService类实现文件监控完整示例:

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

/**
 * 文件监控系统
 */
public class WatchViewTest {
    public static void testWatch() {
        /* 监控目标路径 */
        Path path = Paths.get("C:\\Users\\huangjiawei\\Desktop");
        try {
            /* 创建文件监控对象. */
            WatchService watchService = FileSystems.getDefault().newWatchService();
            /* 注册文件监控的所有事件类型. */
            path.register(
                    watchService,
                    StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_DELETE,
                    StandardWatchEventKinds.ENTRY_MODIFY);
            /* 循环监测文件. */
            while (true) {
                WatchKey watchKey = watchService.take();
                /* 迭代触发事件的所有文件 */
                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    System.out.println(event.context().toString() + " 事件类型:" + event.kind());
                }
                if (!watchKey.reset()) {
                    return;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        testWatch();
    }
}

 

通过上述程序示例我们可以看出,使用WatchService接口进行文件监控非常简单和方便。首先我们需要定义好目标监控路径,然后调用FileSystems类型的newWatchService()方法创建WatchService对象。接下来我们还需使用Path接口的register()方法注册WatchService实例及监控事件。当这些基础作业层全部准备好后,我们再编写外围实时监测循环。最后迭代WatchKey来获取所有触发监控事件的文件即可。

现在我终于知道,spring boot中那个所谓的dev-tools热更新的基本原理啦!原来JDK都有提供这样的API。

来自:https://www.jb51.net/article/136093.htm

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值