SlideShare a Scribd company logo
Submit Search
Upload
CH14:NIO 與 NIO2
Report
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
0 likes
•
326 views
1
of
67
CH14:NIO 與 NIO2
•
0 likes
•
326 views
Download Now
Download to read offline
Report
Technology
認識NIO 使用Channel與Buffer 使用NIO2檔案系統
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
CH10:輸入輸出
Justin Lin
252 views
•
33 slides
CH11:執行緒與並行API
Justin Lin
320 views
•
89 slides
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
5.6K views
•
66 slides
NIO 與 NIO2
Justin Lin
667 views
•
66 slides
資料永續與交換
Justin Lin
1.8K views
•
71 slides
CH16:整合資料庫
Justin Lin
359 views
•
107 slides
More Related Content
What's hot
2. 從 REPL 到 IDE
Justin Lin
234 views
•
28 slides
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Justin Lin
19.2K views
•
53 slides
Ch03 請求與回應
Justin Lin
236 views
•
73 slides
Ch02 撰寫與設定 Servlet
Justin Lin
350 views
•
37 slides
Ch07 使用 JSTL
Justin Lin
161 views
•
74 slides
Servlet & JSP 教學手冊第二版 - 課後練習解答
Justin Lin
4.9K views
•
39 slides
What's hot
(20)
2. 從 REPL 到 IDE
Justin Lin
•
234 views
Servlet & JSP 教學手冊第二版 - 第 1 章:簡介Web應用程式
Justin Lin
•
19.2K views
Ch03 請求與回應
Justin Lin
•
236 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
350 views
Ch07 使用 JSTL
Justin Lin
•
161 views
Servlet & JSP 教學手冊第二版 - 課後練習解答
Justin Lin
•
4.9K views
Ch09 整合資料庫
Justin Lin
•
233 views
Java_07:Thread
Brad Chao
•
440 views
資料永續與交換
Justin Lin
•
519 views
從模組到類別
Justin Lin
•
500 views
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Justin Lin
•
2.9K views
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
Lucene实践
晓锋 陈
•
655 views
CH04:認識物件
Justin Lin
•
421 views
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
2.7K views
Phpar模型实践
Bill Zhao
•
327 views
整合資料庫
Justin Lin
•
855 views
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Justin Lin
•
4.5K views
Servlet & JSP 教學手冊第二版 - 第 2 章:撰寫與設定 Servlet
Justin Lin
•
6.1K views
Similar to CH14:NIO 與 NIO2
Learn Python in 30 min - 4
Chia-Hao Tsai
328 views
•
52 slides
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
Chieh Kai Yang
1.7K views
•
41 slides
flashcache原理及改造
Hao(Robin) Dong
514 views
•
32 slides
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
2.2K views
•
48 slides
ASP.NET MVC 6 新功能探索
Will Huang
11.5K views
•
48 slides
Kubernetes project update and how to contribute
inwin stack
674 views
•
45 slides
Similar to CH14:NIO 與 NIO2
(9)
Learn Python in 30 min - 4
Chia-Hao Tsai
•
328 views
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
Chieh Kai Yang
•
1.7K views
flashcache原理及改造
Hao(Robin) Dong
•
514 views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
ASP.NET MVC 6 新功能探索
Will Huang
•
11.5K views
Kubernetes project update and how to contribute
inwin stack
•
674 views
Asp.net mvc 6 新功能初探
Gelis Wu
•
2.7K views
Angular 4 網站開發最佳實務 (Modern Web 2017)
Will Huang
•
9.7K views
DEV305 - ASP.NET 5 開發攻略
Will Huang
•
6.1K views
More from Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走
Justin Lin
271 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch08 自訂標籤
Justin Lin
133 views
•
54 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走
Justin Lin
•
271 views
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch08 自訂標籤
Justin Lin
•
133 views
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理
Justin Lin
•
238 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
14. 進階主題
Justin Lin
•
403 views
13.並行、平行與非同步
Justin Lin
•
236 views
12. 除錯、測試與效能
Justin Lin
•
152 views
11. 常用內建模組
Justin Lin
•
146 views
9. 資料結構
Justin Lin
•
292 views
8. open() 與 io 模組
Justin Lin
•
245 views
7. 例外處理
Justin Lin
•
115 views
6. 類別的繼承
Justin Lin
•
166 views
5. 從模組到類別
Justin Lin
•
169 views
4. 流程語法與函式
Justin Lin
•
188 views
CH14:NIO 與 NIO2
1.
1
2.
NIO 與 NIO2 學習目標 •
認識NIO • 使用Channel與Buffer • 使用NIO2檔案系統 2
3.
NIO概觀 • 在10.1.1中看過的dump()方法 3
4.
NIO概觀 • 若使用NIO的話,可以如下撰寫: 4
5.
Channel架構與操作 5
6.
Channel架構與操作 • 想要取得Channel的實作物件,可以使用 Channels類別 • 靜態方法newChannel(),可以讓你從 InputStream、OutputStream分別建立 ReadableByteChannel、 WritableByteChannel 6
7.
Channel架構與操作 • 有些InputStream、OutputStream實例 本身也有方法可以取得Channel實例 • FileInputSteam、FileOutputStream 都有個getChannel()方法可以分別取得 FileChannel實例 7
8.
Channel架構與操作 • 已經有相關的Channel實例,也可以透過 Channels上其他newXXX()靜態方法,取 得InputStream、OutputStream、 Reader、Writer實例 8
9.
Buffer架構與操作 9
10.
Buffer架構與操作 • 容量、界限與存取位置 • clear()、flip()與rewind() •
mark()、reset()、remaining() 10
11.
Buffer架構與操作 • Buffer的直接子類別們都有個allocate() 靜態方法,可以讓你指定Buffer容量 (Capacity) • 如果想取得Buffer內部的陣列,可以使用 array()方法 •
陣列想要轉為某個Buffer子類實例,每個 Buffer子類別實例都有wrap()靜態方法 11
12.
Buffer架構與操作 • ByteBuffer還有一個allocateDirect() 方法 • 會利用作業系統的原生I/O操作,試著避免 JVM的中介轉接 •
建議用在大型、存活長的ByteBuffer物件 12
13.
Buffer架構與操作 • Buffer是容器,填裝資料不會超過它的容量 • 實際可讀取或寫入的資料界限(Limit)索引 值可以由limit()方法得知或設定 •
下一個可讀取資料的位置(Position)索引值, 可以使用position()方法得知或設定 13
14.
Buffer架構與操作 • ByteBuffer初建立或呼叫clear() 14
15.
Buffer架構與操作 • ByteBuffer被寫入了16位元組 15
16.
Buffer架構與操作 • ByteBuffer呼叫了flip()方法 16
17.
17
18.
Buffer架構與操作 • 呼叫rewind()方法的話,會將position設為0, 而limit不變 • 這個方法通常用在想要重複讀取Buffer中某 段資料時使用,作用相當於單獨呼叫Buffer 的position(0)方法。 18
19.
NIO2檔案系統 • JDK7在java.nio.file、 java.nio.file.attribute與 java.nio.file.spi套件中,提供了存取 預設檔案系統進行各種輸入輸出的API – 簡化現有檔案輸入輸出API的操作 –
增加許多過去沒有提供的檔案系統存取功能 19
20.
概述API架構 20
21.
概述API架構 21
22.
概述API架構 • 應用程式開發者可以透過java.nio.file 套件中FileSystems、Paths、Files等 類別提供的靜態方法,取得相關實作物件或 進行各種檔案系統操作 • 這些靜態方法內部會運用 FileSystemProvider來取得所需的實作 物件,完成應有的操作 22
23.
概述API架構 • 想要取得java.nio.file.FileSystem實 作物件: • 可以使用系統屬性 "java.nio.file.spi.DefaultFileSystemProvider"指 定該廠商實作的類別名稱 23
24.
操作路徑 • Path實例是在JVM中路徑的代表物件,也是 NIO2檔案系統API操作的起點 • Paths.get()的第二個參數開始接受不定 長度引數 24
25.
操作路徑 • Path實例僅代表路徑資訊,路徑實際對應的 檔案或資料夾(也是一種檔案)不一定存在 • Path提供一些方法取得路徑的各種資訊 25
26.
操作路徑 • Path實作了Iterable介面 • 路徑中若有冗餘資訊,可以使用 normalize()方法移除 26
27.
操作路徑 • toAbsolutePath()方法可以將(相對路 徑)Path轉為絕對路徑Path • 如果路徑是符號連結(Symbolic
link), toRealPath()可以轉換為真正的路徑,若 是相對路徑則轉換為絕對路徑,若路徑中有 冗餘資訊也會移除 27
28.
操作路徑 • 路徑與路徑可以使用resolve()結合。例如 以下最後得到代表C:UsersJustin的Path實例: 28
29.
操作路徑 • 想知道如何從一個路徑切換至另一路徑,則 可以使用relativize()方法 29
30.
操作路徑 • 使用equals()方法比較兩個Path實例的路 徑是否相同 • 使用startsWith()比較路徑起始是否相同 •
使用endsWith()比較路徑結尾是否相同 • 如果檔案系統支援符號連結,兩個路徑不同 的Path實例,有可能是指向同一檔案 – 可以使用Files.isSameFile()測試看看是否 如此 30
31.
操作路徑 • 想確定Path代表的路徑,實際上是否存在檔 案,可以使用Files.exists()或 Files.notExists() – Files.exists()僅在檔案存在時傳回true, 如果檔案不存在或無法確認存不存在(例如沒有 權限存取檔案)則傳回false –
Files.notExists()會在檔案不存在時傳回 true,如果檔案存在或無法確認存不存在則傳 回false 31
32.
操作路徑 • 對於檔案的一些基本屬性,可以使用Files 的isExecutable()、isHidden()、 isReadable()、isRegularFile()、 isSymbolicLink()、isWritable()等 方法來得知 • 如果需要更多檔案屬性資訊,則必須透過 BasicFileAttributes或搭配 FileAttributeView來取得 32
33.
屬性讀取與設定 33
34.
屬性讀取與設定 34
35.
屬性讀取與設定 • creationTime()、lastAccessTime()、 lastModifiedTime()傳回的是FileTime實例, 也可以透過Files.getLastModifiedTime()取 得最後修改時間 • 若想設定最後修改時間,可以透過 Files.setLastModifiedTime()指定代表修改 時間的FileTime實例: 35
36.
屬性讀取與設定 • 屬性設定可透過Files.setAttribute()方法。 例如設定檔案為隱藏: • Files.setAttribute()第二個引數必須指定 FileAttributeView子介面規範的名稱,格式為 [view-name:]attribute-name –
view-name可以從FileAttributeView子介面實作物件 的name()方法取得(亦可查看API文件),如果省略就 預設為“basic” – attribute-name可在FileAttributeView各子介面的 API文件中查詢 36
37.
屬性讀取與設定 • 例如同樣設定最後修改時間,改用 Files.setAttributes()可以如下撰寫: 37
38.
屬性讀取與設定 • 可以透過Files.getAttribute()方法取 得各種檔案屬性,使用方式類似 setAttributes() • 也可透過Files.readAttributes()另一 版本取得Map<String,
Object>物件,鍵 部份指定屬性名稱,就可以取得屬性值 38
39.
屬性讀取與設定 • 可以如下取得DosFileAttributes實例: 39
40.
屬性讀取與設定 • 如果想取得儲存裝置本身的資訊,可以利用 Files.getFileStore()方法取得指定路 徑的FileStore實例 • 或透過FileSystem的getFileStores() 方法取得所有儲存裝置的FileStore實例 40
41.
41
42.
42
43.
操作檔案與目錄 • 想要刪除Path代表的檔案或目錄,可以使用 Files.delete()方法 – 如果不存在,會拋出NoSuchFileException –
如果因目錄不為空而無法刪除檔案,會拋出 DirectoryNotEmptyException • 使用Files.deleteIfExists()方法也可 以刪除檔案,這個方法在檔案不存在時呼叫, 並不會拋出例外 43
44.
操作檔案與目錄 • 如果想要複製來源Path的檔案或目錄至目的地 Path,可以使用Files.copy()方法 – 第三個選項可以指定CopyOption介面的實作物件, CopyOption實作類別有以Enum型態實作的 StandardCopyOption與LinkOption –
StandardCopyOption的REPLACE_EXISTING實例進 行複製時,若目標檔案已存在就會予以覆蓋, COPY_ATTRIBUTES會嘗試複製相關屬性 – LinkOption的NOFOLLOW_LINKS則不會跟隨符號連結 44
45.
操作檔案與目錄 • 一個使用Files.copy()的範例如下: • Files.copy()還有重載兩個版本 –
接受InputStream作為來源,可直接讀取資料, 並將結果複製至指定的Path中 – 將來源Path複製至指定的OutputStream 45
46.
操作檔案與目錄 • 可改寫10.1.1中的Download為以下: 46
47.
操作檔案與目錄 • 若要進行檔案或目錄移動,可以使用 Files.move()方法 • 如果要建立目錄,可以使用 Files.createDirectory()方法,如果呼叫時 父目錄不存在,會拋出NoSuchFileException •
Files.createDirectories()會在父目錄不存 在時一併建立 • 如果要建立暫存目錄,可以使用Files. createTempDirectory()方法 47
48.
操作檔案與目錄 • 對於java.io中的基本輸入輸出API,NIO2 也作了封裝 – 可使用Files.readAllBytes()讀取整個檔案, 然後以byte[]傳回檔案內容 –
如果檔案內容都是字元,則可使用 Files.readAllLines()指定檔案Path與編 碼,讀取整個檔案,將檔案中每行收集在 List<String>中傳回 48
49.
操作檔案與目錄 • 如果本來有個建立BufferedReader的片段 如下: • 可使用Files.newBufferedReader()改 寫如下: 49
50.
操作檔案與目錄 • 如果想要以InputStream、 OutputStream處理檔案,也有對應的 Files.newInputStream()、 Files.newOutputStream()可以使用 50
51.
讀取、走訪目錄 • 如果想要取得檔案系統根目錄路徑資訊,可 以使用FileSystem的 getRootDirectories()方法 51
52.
讀取、走訪目錄 • 可以使用Files.newDirectoryStream() 方法取得DirectoryStream介面實作物件, 代表指定路徑下的所有檔案 • 在不使用DirectoryStream物件時必須使 用close()方法關閉相關資源 •
DirectoryStream繼承了Closeable介面, 其父介面為AutoClosable介面,所以可搭 配嘗試關閉資源語法來簡化程式撰寫 52
53.
讀取、走訪目錄 • Files.newDirectoryStream()實際傳 回的是DirectoryStream<Path> • DirectoryStream也繼承了Iterable介 面,所以可使用增強式for迴圈語法來逐一 取得Path 53
54.
讀取、走訪目錄 54
55.
讀取、走訪目錄 • 如果想要走訪目錄中所有檔案與子目錄,可 以實作FileVisitor介面 55
56.
讀取、走訪目錄 56
57.
讀取、走訪目錄 • 可以繼承SimpleFileVisitor類別,這個 類別實作了FileVisitor介面,你只要繼 承之後重新定義感興趣的方法就可以了 57
58.
58
59.
讀取、走訪目錄 • 如果要使用FileVisitor走訪目錄,可以 使用Files.walkFileTree()方法: 59
60.
讀取、走訪目錄 • Files新增了list()與walk()靜態方法, 它傳回的是Stream<Path> • lines()、list()與walk()傳回的 Stream不使用時需要呼叫close()方法來 釋放資源 60
61.
過濾、搜尋檔案 • 想顯示.class與.jar檔案: • 像*.{class,jar}這樣的語法稱之為Glob 61
62.
過濾、搜尋檔案 62
63.
過濾、搜尋檔案 • *.java比對.java結尾的字串。 • **/*Test.java跨目錄比對Test.java結尾的字串, 例如BookmarkTest.java、CommandTest.java都符合。 •
???符合三個字元,例如123、abc會符合。 • a?*.java比對a之後至少一個字元,並以.java結尾 的字串。 • *.{class,jar}符合.class或.jar結尾的字串。 • *[0-9]*比對的字串中要有一個數字。 • {*[0-9]*,*.java}比對字串中要有一個數字, 或者是.java結尾。 63
64.
過濾、搜尋檔案 64
65.
過濾、搜尋檔案 • 如果Glob語法無法滿足條件過濾需求時,可 以自行實作DirectoryStream.Filter的 accept()方法自訂過濾條件 65
66.
過濾、搜尋檔案 • 可以使用FileSystem實例的 getPathMatcher()取得PathMatcher介 面實作物件 – 可以指定使用哪種模式比對語法,"regex"表示 使用規則表示式語法、"glob"表示Glob語法 66
67.
67