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");
}
}
複製代碼
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
包下使用Path
、Paths
、Files
、WatchService
、FileSystem
等經常使用類型能夠很好的簡化開發人員對文件管理的編碼工做。bash
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
}
}
複製代碼
聯用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
,開發人員則無需關注。
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。
參考資料: