JDK 7 新特性小結(jié)實例代碼解析
1、switch支持String做參數(shù)
/***
* switch支持字符串做參數(shù) 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("");//我是你的唯一!
}
}
switch枚舉支持
/**
* switch 枚舉支持 jdk5
* @author huangjiawei
*
*/
public class SwitchMonthTest {
public static void SwithMonthTest(Month month) {
switch (month) {
case JANUARY:
System.err.println("這是一月份");
break;
case FEBRUARY:
System.err.println("這是二月份");
break;
case MARCH:
System.err.println("這是三月份");
break;
}
}
public static void main(String[] args) {
SwithMonthTest(Month.JANUARY);//這是一月份
SwithMonthTest(Month.FEBRUARY);//這是二月份
SwithMonthTest(Month.MARCH);//這是三月份
}
}
2、數(shù)字字面量的改進
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、資源自動關(guān)閉
在Java中,有許多的資源在使用完成之后需要對其進行關(guān)閉操作。舉個栗子,InputStream,Writer,Sockets,Connection等等。在Java 7 之前通常都是顯示調(diào)用其close()方法,在Java 7,你可以不用理會其是否未關(guān)閉,我們可以使用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();//流已經(jīng)關(guān)閉,此處拋出異常
} catch (Exception e) {
System.err.println("BufferedReader close Exception" + e);
}
}
}
return "";
}
/*
* 接受一個文件的路徑 Java7
*/
public static String tryTest1(String path) {
/*
* 當try語句塊運行結(jié)束時,F(xiàn)ileInputStream 會被自動關(guān)閉。這是因為FileInputStream 實現(xiàn)了java中的java.lang.AutoCloseable接口。
* 所有實現(xiàn)了這個接口的類都可以在try-with-resources結(jié)構(gòu)中使用。
*/
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語句永遠只執(zhí)行第一個匹配到的catch異常,后面有再多的catch都會被忽略掉
* @author huangjiawei
*
*/
public class CatchTest {
/*
* java 7以前
*/
public static void CatchTest() {
int a = 100;
int b = 0;
Date date = null;
try {
System.err.println(date.getTime());//這里拋出異常,下面的語句就不會執(zhí)行啦!
int result = a/b;//不會執(zhí)行
System.err.println(result);//不會執(zhí)行
}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、實例創(chuàng)建類型推斷
import java.util.ArrayList;
import java.util.List;
public class TypeTest {
/*
* java 7前,前后<>都必須聲明類型
*/
List<String> list = new ArrayList<String>();
/*
* java 7,后<>不須聲明類型,自動根據(jù)前面<>推斷其類型
*/
List<String> list1 = new ArrayList<>();
}
6、增強的文件系統(tǒng)
Java7 推出了全新的NIO2.0 API以此改變針對文件管理的不便,使得在java.nio.file包下使用Path、Paths、Files、WatchService、FileSystem等常用類型可以很好的簡化開發(fā)人員對文件管理的編碼工作。
6.1 Path接口和Paths類
Path接口的某些功能其實可以和java.io包下的File類等價,當然這些功能僅限于只讀操作。在實際開發(fā)過程中,開發(fā)人員可以聯(lián)用Path接口和Paths類,從而獲取文件的一系列上下文信息。
- int getNameCount(): 獲取當前文件節(jié)點數(shù)
- Path getFileName(): 獲取當前文件名稱
- Path getRoot(): 獲取當前文件根目錄
- Path getParent(): 獲取當前文件上級關(guān)聯(lián)目錄
聯(lián)用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("文件節(jié)點數(shù):" + path.getNameCount()); //文件節(jié)點數(shù):4
System.out.println("文件名稱:" + path.getFileName()); //文件名稱:my-release-key.keystore
System.out.println("文件根目錄:" + path.getRoot()); //文件根目錄:C:\
System.out.println("文件上級關(guān)聯(lián)目錄:" + path.getParent());//文件上級關(guān)聯(lián)目錄:C:\Users\huangjiawei\Desktop
}
}
6.2. Files類
聯(lián)用Path接口和Paths類可以很方便的訪問到目標文件的上下文信息。當然這些操作全都是只讀的,如果開發(fā)人員想對文件進行其它非只讀操作,比如文件的創(chuàng)建、修改、刪除等操作,則可以使用Files類型進行操作。
Files類型常用方法如下:
- Path createFile(): 在指定的目標目錄創(chuàng)建新文件
- void delete(): 刪除指定目標路徑的文件或文件夾
- Path copy(): 將指定目標路徑的文件拷貝到另一個文件中
- Path move(): 將指定目標路徑的文件轉(zhuǎn)移到其他路徑下,并刪除源文件
使用Files類型復制、粘貼文件示例:
Files.copy(Paths.get("/test/src.xml"), Paths.get("/test/target.xml"));
使用Files類型來管理文件,相對于傳統(tǒng)的I/O方式來說更加方便和簡單。因為具體的操作實現(xiàn)將全部移交給NIO2.0 API,開發(fā)人員則無需關(guān)注。
6.3. WatchService
Java7 還為開發(fā)人員提供了一套全新的文件系統(tǒng)功能,那就是文件監(jiān)測。在此或許有很多朋友并不知曉文件監(jiān)測有何意義及目,那么請大家回想下調(diào)試成熱發(fā)布功能后的Web容器。當項目迭代后并重新部署時,開發(fā)人員無需對其進行手動重啟,因為Web容器一旦監(jiān)測到文件發(fā)生改變后,便會自動去適應(yīng)這些“變化”并重新進行內(nèi)部裝載。Web容器的熱發(fā)布功能同樣也是基于文件監(jiān)測功能,所以不得不承認,文件監(jiān)測功能的出現(xiàn)對于Java文件系統(tǒng)來說是具有重大意義的。
文件監(jiān)測是基于事件驅(qū)動的,事件觸發(fā)是作為監(jiān)測的先決條件。開發(fā)人員可以使用java.nio.file包下的StandardWatchEventKinds類型提供的3種字面常量來定義監(jiān)測事件類型,值得注意的是監(jiān)測事件需要和WatchService實例一起進行注冊。
StandardWatchEventKinds類型提供的監(jiān)測事件:
- ENTRY_CREATE:文件或文件夾新建事件;
- ENTRY_DELETE:文件或文件夾刪除事件;
- ENTRY_MODIFY:文件或文件夾粘貼事件;
使用WatchService類實現(xiàn)文件監(jiān)控完整示例:
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;
/**
* 文件監(jiān)控系統(tǒng)
* @author huangjiawei
*/
public class WatchViewTest {
public static void testWatch() {
/* 監(jiān)控目標路徑 */
Path path = Paths.get("C:\\Users\\huangjiawei\\Desktop");
try {
/* 創(chuàng)建文件監(jiān)控對象. */
WatchService watchService = FileSystems.getDefault().newWatchService();
/* 注冊文件監(jiān)控的所有事件類型. */
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
/* 循環(huán)監(jiān)測文件. */
while (true) {
WatchKey watchKey = watchService.take();
/* 迭代觸發(fā)事件的所有文件 */
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接口進行文件監(jiān)控非常簡單和方便。首先我們需要定義好目標監(jiān)控路徑,然后調(diào)用FileSystems類型的newWatchService()方法創(chuàng)建WatchService對象。接下來我們還需使用Path接口的register()方法注冊WatchService實例及監(jiān)控事件。當這些基礎(chǔ)作業(yè)層全部準備好后,我們再編寫外圍實時監(jiān)測循環(huán)。最后迭代WatchKey來獲取所有觸發(fā)監(jiān)控事件的文件即可。
現(xiàn)在我終于知道,spring boot中那個所謂的dev-tools熱更新的基本原理啦!原來JDK都有提供這樣的API。
總結(jié)
以上所述是小編給大家介紹的JDK 7 新特性小結(jié)實例代碼解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺為例)
- windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程
- win10 java(jdk安裝)環(huán)境變量配置和相關(guān)問題
- Windows10系統(tǒng)下JDK1.8的下載安裝及環(huán)境變量配置的教程
- JDK8新特性之判空遍歷寫法
- 深入淺析JDK8新特性之Lambda表達式
- Java JDK1.5、1.6、1.7新特性整理
- JDK 14的新特性:文本塊Text Blocks的使用
- JDK14的新特性NullPointerExceptions的使用
- JDK10新特性之本地變量類型var的深入理解
相關(guān)文章
Springboot2以代碼的方式統(tǒng)一配置Jackson教程
這篇文章主要介紹了Springboot2以代碼的方式統(tǒng)一配置Jackson教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
詳解Spring Boot加載properties和yml配置文件
springboot運行時新增/更新外部接口的實現(xiàn)方法
關(guān)于mybatis if else if 條件判斷SQL片段表達式取值和拼接問題

