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("");//我是你的唯一! }}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、數字字面量的改進
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都會被忽略掉* @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(); }}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類,從而獲取文件的一系列上下文信息。
聯用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類型常用方法如下:
使用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類型提供的監測事件:
使用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。
總結
以上所述是小編給大家介紹的JDK 7 新特性小結實例代碼解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!