java7 nio2 新特性_JDK7新特性,你知道几个?
前言
之前學習的過程中,每天都是老師說這個是JDK7以后可以使用,那個是JDK8以后可以使用,每天都記的很混亂,今天專門忙里偷閑,歸攏整理下JDK7的新特性,對于JDK的新特性,后期會進行整理更新,希望可以幫助到有需要的朋友。
一,語法上
1.1switch中可以使用字串了
String s = "test";
switch (s) {
case "test" :
System.out.println("test");
case "test1" :
System.out.println("test1");
break ;
default :
System.out.println("break");
break ;
}
1.2二進制變量的表示,支持將整數類型用二進制來表示,用0b開頭。
// 所有整數 int, short,long,byte都可以用二進制表示
// An 8-bit 'byte' value:
byte aByte = (byte) 0b00100001;
// A 16-bit 'short' value:
short aShort = (short) 0b1010000101000101;
// Some 32-bit 'int' values:
intanInt1 = 0b10100001010001011010000101000101;
intanInt2 = 0b101;
intanInt3 = 0B101; // The B can be upper or lower case.
// A 64-bit 'long' value. Note the "L" suffix:
long aLong =
0b1010000101000101101000010100010110100001010001011010000101000101L;
// 二進制在數組等的使用
final int[] phases = { 0b00110001, 0b01100010, 0b11000100, 0b10001001,0b00010011, 0b00100110, 0b01001100, 0b10011000 };
1.3 Try-with-resource語句
注意:實現java.lang.AutoCloseable接口的資源都可以放到try中,跟final里面的關閉資源類似; 按照聲明逆序關閉資源 ;Try塊拋出的異常通過Throwable.getSuppressed獲取
try (java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)) {
// Enumerate each entry
for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements()) {
// Get the entry name and write it to the output file
String newLine = System.getProperty("line.separator");
String zipEntryName = ((java.util.zip.ZipEntry) entries
.nextElement()).getName() + newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
}
1.4 Catch多個異常 說明:Catch異常類型為final; 生成Bytecode 會比多個catch小; Rethrow時保持異常類型
public static void main(String[] args) throws Exception {
try {
testthrows();
} catch (IOException | SQLException ex) {
throw ex;
}
}
public static void testthrows() throws IOException, SQLException {}
1.5 數字類型的下劃線表示 更友好的表示方式,不過要注意下劃線添加的一些標準,可以參考下面的示例
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
//float pi1 = 3_.1415F;// Invalid; cannot put underscores adjacent to a decimal point
//float pi2 = 3._1415F;// Invalid; cannot put underscores adjacent to a decimal point
//long socialSecurityNumber1= 999_99_9999_L;// Invalid; cannot put underscores prior to an L suffix
//int x1 = _52;// This is an identifier, not a numeric literal
int x2 = 5_2;// OK (decimal literal)
//int x3 = 52_;// Invalid; cannot put underscores at the end of a literal
int x4 = 52;// OK (decimal literal)
//int x5 = 0_x52;// Invalid; cannot put underscores in the 0x radix prefix
//int x6 = 0x_52;// Invalid; cannot put underscores at the beginning of a number
int x7 = 0x5_2;// OK (hexadecimal literal)
//int x8 = 0x52_;// Invalid; cannot put underscores at the end of a number
int x9 = 0_52; // OK (octal literal)
int x10 = 05_2;// OK (octal literal)
//int x11 = 052_;// Invalid; cannot put underscores at the end of a number
1.6 泛型實例的創建可以通過類型推斷來簡化 可以去掉后面new部分的泛型類型,只用<>就可以了。
//使用泛型前
List strList = new ArrayList();
List strList4 = new ArrayList();
List>> strList5 = new ArrayList>>();
//編譯器使用尖括號 (<>) 推斷類型
List strList0 = new ArrayList();
List>> strList1 = new ArrayList>>();
List strList2 = new ArrayList<>();
List>> strList3 = new ArrayList<>();
List list = new ArrayList<>();
list.add("A");
// The following statement should fail since addAll expects
// Collection extends String>
//list.addAll(new ArrayList<>());
1.7在可變參數方法中傳遞非具體化參數,改進編譯警告和錯誤
Heap pollution 指一個變量被指向另外一個不是相同類型的變量。例如
List l = new ArrayList();
List ls = l; // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0); // ClassCastException is thrown
Jdk7:
public static void addToList (List listArg, T... elements) {
for (T x : elements) {
listArg.add(x);
}
}
你會得到一個warning
warning: [varargs] Possible heap pollution from parameterized vararg type
要消除警告,可以有三種方式
1.加 annotation @SafeVarargs
2.加 annotation @SuppressWarnings({"unchecked", "varargs"})
3.使用編譯器參數 –Xlint:varargs;
1.8 信息更豐富的回溯追蹤 就是上面try中try語句和里面的語句同時拋出異常時,異常棧的信息
java.io.IOException at Suppress.write(Suppress.java:19)at Suppress.main(Suppress.java:8)
Suppressed: java.io.IOException at Suppress.close(Suppress.java:24)
at Suppress.main(Suppress.java:9)
Suppressed: java.io.IOException at Suppress.close(Suppress.java:24)
at Suppress.main(Suppress.java:9)
二、NIO2的一些新特性
java.nio.file 和java.nio.file.attribute包 支持更詳細屬性,比如權限,所有者
symbolic and hard links支持
Path訪問文件系統,Files支持各種文件操作
高效的訪問metadata信息
遞歸查找文件樹,文件擴展搜索
文件系統修改通知機制
File類操作API兼容
文件隨機訪問增強 mapping a region,locl a region,絕對位置讀取
AIO Reactor(基于事件)和Proactor
下面列一些示例:
2.1 IO and New IO 監聽文件系統變化通知
通過FileSystems.getDefault().newWatchService()獲取watchService,然后將需要監聽的path目錄注冊到這個watchservice中,對于這個目錄的文件修改,新增,刪除等實踐可以配置,然后就自動能監聽到響應的事件。
private WatchService watcher;
public TestWatcherService(Path path) throws IOException {
watcher = FileSystems.getDefault().newWatchService();
path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
}
public void handleEvents() throws InterruptedException {
while (true) {
WatchKey key = watcher.take();
for (WatchEvent> event : key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
if (kind == OVERFLOW) {// 事件可能lost or discarded
continue;
}
WatchEvent e = (WatchEvent) event;
Path fileName = e.context();
System.out.printf("Event %s has happened,which fileName is %s%n",kind.name(), fileName);
}
if (!key.reset()) {
break;
}
2.2 IO and New IO遍歷文件樹,通過繼承SimpleFileVisitor類,實現事件遍歷目錄樹操作,然后通過Files.walkFileTree(listDir, opts,Integer.MAX_VALUE, walk);這個API來遍歷目錄樹
private void workFilePath() {
Path listDir = Paths.get("/tmp"); // define the starting file
ListTree walk = new ListTree();
Files.walkFileTree(listDir, walk);
// 遍歷的時候跟蹤鏈接
EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
try {
Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);
} catch (IOException e) {
System.err.println(e);
}
class ListTree extends SimpleFileVisitor {// NIO2 遞歸遍歷文件目錄的接口
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
System.out.println("Visited directory: " + dir.toString());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.out.println(exc);
return FileVisitResult.CONTINUE;
}
}
2.3 AIO異步IO 文件和網絡 異步IO在java
NIO2實現了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等實現,關于同步阻塞IO,同步非阻塞IO,異步阻塞IO和異步非阻塞IO在ppt的這頁上下面備注有說明,有興趣的可以深入了解下。Java NIO2中就實現了操作系統的異步非阻塞IO。
// 使用AsynchronousFileChannel.open(path, withOptions(),taskExecutor))這個API對異步文件IO的處理
public static void asyFileChannel2() {
final int THREADS = 5;
ExecutorService taskExecutor = Executors.newFixedThreadPool(THREADS);
String encoding = System.getProperty("file.encoding");
List> list = new ArrayList<>();
int sheeps = 0;
Path path = Paths.get("/tmp","store.txt");
try (AsynchronousFileChannel asynchronousFileChannel = AsynchronousFileChannel.open(path, withOptions(), taskExecutor)) {
for (int i = 0; i < 50; i++) {
Callable worker = new Callable(){
@Override
public ByteBuffer call() throws Exception {
ByteBuffer buffer = ByteBuffer.allocateDirect(ThreadLocalRandom.current().nextInt(100, 200));
asynchronousFileChannel.read(buffer, ThreadLocalRandom)
……
三. JDBC 4.1
3.1.可以使用try-with-resources自動關閉Connection, ResultSet, 和 Statement資源對象
3.2. RowSet 1.1:引入RowSetFactory接口和RowSetProvider類,可以創建JDBC driver支持的各種 row sets,這里的rowset實現其實就是將sql語句上的一些操作轉為方法的操作,封裝了一些功能。
3.3. JDBC-ODBC驅動會在jdk8中刪除
try (Statement stmt = con.createStatement()) {
RowSetFactory aFactory = RowSetProvider.newFactory();
CachedRowSet crs = aFactory.createCachedRowSet();
RowSetFactory rsf = RowSetProvider.newFactory("com.sun.rowset.RowSetFactoryImpl", null);
WebRowSet wrs = rsf.createWebRowSet();
createCachedRowSet
createFilteredRowSet
createJdbcRowSet
createJoinRowSet
createWebRowSet
}
四、并發工具增強
4.1.fork-join
最大的增強,充分利用多核特性,將大問題分解成各個子問題,由多個cpu可以同時解決多個子問題,最后合并結果,繼承RecursiveTask,實現compute方法,然后調用fork計算,最后用join合并結果。
class Fibonacci extends RecursiveTask {
final int n;
Fibonacci(int n) {
this.n = n;
}
private int compute(int small) {
final int[] results = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
return results[small];
}
public Integer compute() {
if (n <= 10) {
return compute(n);
}
Fibonacci f1 = new Fibonacci(n - 1);
Fibonacci f2 = new Fibonacci(n - 2);
System.out.println("fork new thread for " + (n - 1));
f1.fork();
System.out.println("fork new thread for " + (n - 2));
f2.fork();
return f1.join() + f2.join();
}
}
4.2.ThreadLocalRandon 并發下隨機數生成類,保證并發下的隨機數生成的線程安全,實際上就是使用threadlocal
final int MAX = 100000;
ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
long start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
threadLocalRandom.nextDouble();
}
long end = System.nanoTime() - start;
System.out.println("use time1 : " + end);
long start2 = System.nanoTime();
for (int i = 0; i < MAX; i++) {
Math.random();
}
long end2 = System.nanoTime() - start2;
System.out.println("use time2 : " + end2);
4.3. phaser 類似cyclebarrier和countdownlatch,不過可以動態添加資源減少資源
void runTasks(List tasks) {
final Phaser phaser = new Phaser(1); // "1" to register self
// create and start threads
for (final Runnable task : tasks) {
phaser.register();
new Thread() {
public void run() {
phaser.arriveAndAwaitAdvance(); // await all creation
task.run();
}
}.start();
}
// allow threads to start and deregister self
phaser.arriveAndDeregister();
}
結尾
由于個人能力問題,還有很多需要改進的地方,如有錯誤,煩請各位大佬私信或留言進行批評指正,在下定當及時更正!
總結
以上是生活随笔為你收集整理的java7 nio2 新特性_JDK7新特性,你知道几个?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android组建之间通信_Androi
- 下一篇: 全数字实时仿真平台SkyEye和同步数据