JDK 7 新特性小結(包含實例代碼)

一、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("");//我是你的惟一!
	}
	
}
複製代碼

switch枚舉支持java

/**
 * 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.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
	}
}
複製代碼

三、資源自動關閉

在Java中,有許多的資源在使用完成以後須要對其進行關閉操做。舉個栗子,InputStream,Writer,Sockets,Connection等等。在Java 7 以前一般都是顯示調用其close()方法,在Java 7,你能夠不用理會其是否未關閉,咱們可使用try-with-resources代碼塊。spring

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");
	}
}
複製代碼

四、catch多個異常

Java7以前,捕獲多個異常必須有多個catch子句,在Java 7,咱們能夠這樣子寫:segmentfault

import java.util.Date;

/**
 * 多個catch語句永遠只執行第一個匹配到的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());//這裏拋出異常,下面的語句就不會執行啦!
			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();
	}
}
複製代碼

五、實例建立類型推斷

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<>();
}
複製代碼

六、加強的文件系統

Java7 推出了全新的NIO2.0 API以此改變針對文件管理的不便,使得在java.nio.file包下使用PathPathsFilesWatchServiceFileSystem等經常使用類型能夠很好的簡化開發人員對文件管理的編碼工做。bash

6.1 Path接口和Paths類

Path接口的某些功能其實能夠和java.io包下的File類等價,固然這些功能僅限於只讀操做。在實際開發過程當中,開發人員能夠聯用Path接口和Paths類,從而獲取文件的一系列上下文信息。ui

  • 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類型進行操做。spa

Files類型經常使用方法以下:調試

  • Path createFile(): 在指定的目標目錄建立新文件code

  • void delete(): 刪除指定目標路徑的文件或文件夾xml

  • 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;

/**
 * 文件監控系統
 * @author huangjiawei
 */
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。


參考資料:

Java7的新特性

Java7的新特性1

相關文章
相關標籤/搜索