Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

NIO 與 NIO2 Slide 1 NIO 與 NIO2 Slide 2 NIO 與 NIO2 Slide 3 NIO 與 NIO2 Slide 4 NIO 與 NIO2 Slide 5 NIO 與 NIO2 Slide 6 NIO 與 NIO2 Slide 7 NIO 與 NIO2 Slide 8 NIO 與 NIO2 Slide 9 NIO 與 NIO2 Slide 10 NIO 與 NIO2 Slide 11 NIO 與 NIO2 Slide 12 NIO 與 NIO2 Slide 13 NIO 與 NIO2 Slide 14 NIO 與 NIO2 Slide 15 NIO 與 NIO2 Slide 16 NIO 與 NIO2 Slide 17 NIO 與 NIO2 Slide 18 NIO 與 NIO2 Slide 19 NIO 與 NIO2 Slide 20 NIO 與 NIO2 Slide 21 NIO 與 NIO2 Slide 22 NIO 與 NIO2 Slide 23 NIO 與 NIO2 Slide 24 NIO 與 NIO2 Slide 25 NIO 與 NIO2 Slide 26 NIO 與 NIO2 Slide 27 NIO 與 NIO2 Slide 28 NIO 與 NIO2 Slide 29 NIO 與 NIO2 Slide 30 NIO 與 NIO2 Slide 31 NIO 與 NIO2 Slide 32 NIO 與 NIO2 Slide 33 NIO 與 NIO2 Slide 34 NIO 與 NIO2 Slide 35 NIO 與 NIO2 Slide 36 NIO 與 NIO2 Slide 37 NIO 與 NIO2 Slide 38 NIO 與 NIO2 Slide 39 NIO 與 NIO2 Slide 40 NIO 與 NIO2 Slide 41 NIO 與 NIO2 Slide 42 NIO 與 NIO2 Slide 43 NIO 與 NIO2 Slide 44 NIO 與 NIO2 Slide 45 NIO 與 NIO2 Slide 46 NIO 與 NIO2 Slide 47 NIO 與 NIO2 Slide 48 NIO 與 NIO2 Slide 49 NIO 與 NIO2 Slide 50 NIO 與 NIO2 Slide 51 NIO 與 NIO2 Slide 52 NIO 與 NIO2 Slide 53 NIO 與 NIO2 Slide 54 NIO 與 NIO2 Slide 55 NIO 與 NIO2 Slide 56 NIO 與 NIO2 Slide 57 NIO 與 NIO2 Slide 58 NIO 與 NIO2 Slide 59 NIO 與 NIO2 Slide 60 NIO 與 NIO2 Slide 61 NIO 與 NIO2 Slide 62 NIO 與 NIO2 Slide 63 NIO 與 NIO2 Slide 64 NIO 與 NIO2 Slide 65 NIO 與 NIO2 Slide 66
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

3 Likes

Share

Download to read offline

NIO 與 NIO2

Download to read offline

認識NIO
使用Channel與Buffer
使用NIO2檔案系統

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

NIO 與 NIO2

  1. 1. 1
  2. 2. NIO 與 NIO2 學習目標 • 認識NIO • 使用Channel與Buffer • 使用NIO2檔案系統 2
  3. 3. NIO概觀 • 在10.1.1中看過的dump()方法 3
  4. 4. NIO概觀 • 若使用NIO的話,可以如下撰寫: 4
  5. 5. Channel架構與操作 5
  6. 6. Channel架構與操作 • 想要取得Channel的實作物件,可以使用 Channels類別 • 靜態方法newChannel(),可以讓你從 InputStream、OutputStream分別建立 ReadableByteChannel、 WritableByteChannel 6
  7. 7. Channel架構與操作 • 有些InputStream、OutputStream實例 本身也有方法可以取得Channel實例 • FileInputSteam、FileOutputStream 都有個getChannel()方法可以分別取得 FileChannel實例 7
  8. 8. Channel架構與操作 • 已經有相關的Channel實例,也可以透過 Channels上其他newXXX()靜態方法,取 得InputStream、OutputStream、 Reader、Writer實例 8
  9. 9. Buffer架構與操作 9
  10. 10. Buffer架構與操作 • 容量、界限與存取位置 • clear()、flip()與rewind() • mark()、reset()、remaining() 10
  11. 11. Buffer架構與操作 • Buffer的直接子類別們都有個allocate() 靜態方法,可以讓你指定Buffer容量 (Capacity) • 如果想取得Buffer內部的陣列,可以使用 array()方法 • 陣列想要轉為某個Buffer子類實例,每個 Buffer子類別實例都有wrap()靜態方法 11
  12. 12. Buffer架構與操作 • ByteBuffer還有一個allocateDirect() 方法 • 會利用作業系統的原生I/O操作,試著避免 JVM的中介轉接 • 建議用在大型、存活長的ByteBuffer物件 12
  13. 13. Buffer架構與操作 • Buffer是容器,填裝資料不會超過它的容量 • 實際可讀取或寫入的資料界限(Limit)索引 值可以由limit()方法得知或設定 • 下一個可讀取資料的位置(Position)索引值, 可以使用position()方法得知或設定 13
  14. 14. Buffer架構與操作 • ByteBuffer初建立或呼叫clear() 14
  15. 15. Buffer架構與操作 • ByteBuffer被寫入了16位元組 15
  16. 16. Buffer架構與操作 • ByteBuffer呼叫了flip()方法 16
  17. 17. 17
  18. 18. Buffer架構與操作 • 呼叫rewind()方法的話,會將position設為0, 而limit不變 • 這個方法通常用在想要重複讀取Buffer中某 段資料時使用,作用相當於單獨呼叫Buffer 的position(0)方法。 18
  19. 19. NIO2檔案系統 • JDK7在java.nio.file、 java.nio.file.attribute與 java.nio.file.spi套件中,提供了存取 預設檔案系統進行各種輸入輸出的API – 簡化現有檔案輸入輸出API的操作 – 增加許多過去沒有提供的檔案系統存取功能 19
  20. 20. 概述API架構 20
  21. 21. 概述API架構 21
  22. 22. 概述API架構 • 應用程式開發者可以透過java.nio.file 套件中FileSystems、Paths、Files等 類別提供的靜態方法,取得相關實作物件或 進行各種檔案系統操作 • 這些靜態方法內部會運用 FileSystemProvider來取得所需的實作 物件,完成應有的操作 22
  23. 23. 概述API架構 • 想要取得java.nio.file.FileSystem實 作物件: • 可以使用系統屬性 "java.nio.file.spi.DefaultFileSystemProvider"指 定該廠商實作的類別名稱 23
  24. 24. 操作路徑 • Path實例是在JVM中路徑的代表物件,也是 NIO2檔案系統API操作的起點 • Paths.get()的第二個參數開始接受不定 長度引數 24
  25. 25. 操作路徑 • Path實例僅代表路徑資訊,路徑實際對應的 檔案或資料夾(也是一種檔案)不一定存在 • Path提供一些方法取得路徑的各種資訊 25
  26. 26. 操作路徑 • Path實作了Iterable介面 • 路徑中若有冗餘資訊,可以使用 normalize()方法移除 26
  27. 27. 操作路徑 • toAbsolutePath()方法可以將(相對路 徑)Path轉為絕對路徑Path • 如果路徑是符號連結(Symbolic link), toRealPath()可以轉換為真正的路徑,若 是相對路徑則轉換為絕對路徑,若路徑中有 冗餘資訊也會移除 27
  28. 28. 操作路徑 • 路徑與路徑可以使用resolve()結合。例如 以下最後得到代表C:UsersJustin的Path實例: 28
  29. 29. 操作路徑 • 想知道如何從一個路徑切換至另一路徑,則 可以使用relativize()方法 29
  30. 30. 操作路徑 • 使用equals()方法比較兩個Path實例的路 徑是否相同 • 使用startsWith()比較路徑起始是否相同 • 使用endsWith()比較路徑結尾是否相同 • 如果檔案系統支援符號連結,兩個路徑不同 的Path實例,有可能是指向同一檔案 – 可以使用Files.isSameFile()測試看看是否 如此 30
  31. 31. 操作路徑 • 想確定Path代表的路徑,實際上是否存在檔 案,可以使用Files.exists()或 Files.notExists() – Files.exists()僅在檔案存在時傳回true, 如果檔案不存在或無法確認存不存在(例如沒有 權限存取檔案)則傳回false – Files.notExists()會在檔案不存在時傳回 true,如果檔案存在或無法確認存不存在則傳 回false 31
  32. 32. 操作路徑 • 對於檔案的一些基本屬性,可以使用Files 的isExecutable()、isHidden()、 isReadable()、isRegularFile()、 isSymbolicLink()、isWritable()等 方法來得知 • 如果需要更多檔案屬性資訊,則必須透過 BasicFileAttributes或搭配 FileAttributeView來取得 32
  33. 33. 屬性讀取與設定 33
  34. 34. 屬性讀取與設定 34
  35. 35. 屬性讀取與設定 • creationTime()、lastAccessTime()、 lastModifiedTime()傳回的是FileTime實例, 也可以透過Files.getLastModifiedTime()取 得最後修改時間 • 若想設定最後修改時間,可以透過 Files.setLastModifiedTime()指定代表修改 時間的FileTime實例: 35
  36. 36. 屬性讀取與設定 • 屬性設定可透過Files.setAttribute()方法。 例如設定檔案為隱藏: • Files.setAttribute()第二個引數必須指定 FileAttributeView子介面規範的名稱,格式為 [view-name:]attribute-name – view-name可以從FileAttributeView子介面實作物件 的name()方法取得(亦可查看API文件),如果省略就 預設為“basic” – attribute-name可在FileAttributeView各子介面的 API文件中查詢 36
  37. 37. 屬性讀取與設定 • 例如同樣設定最後修改時間,改用 Files.setAttributes()可以如下撰寫: 37
  38. 38. 屬性讀取與設定 • 可以透過Files.getAttribute()方法取 得各種檔案屬性,使用方式類似 setAttributes() • 也可透過Files.readAttributes()另一 版本取得Map<String, Object>物件,鍵 部份指定屬性名稱,就可以取得屬性值 38
  39. 39. 屬性讀取與設定 • 可以如下取得DosFileAttributes實例: 39
  40. 40. 屬性讀取與設定 • 如果想取得儲存裝置本身的資訊,可以利用 Files.getFileStore()方法取得指定路 徑的FileStore實例 • 或透過FileSystem的getFileStores() 方法取得所有儲存裝置的FileStore實例 40
  41. 41. 41
  42. 42. 操作檔案與目錄 • 想要刪除Path代表的檔案或目錄,可以使用 Files.delete()方法 – 如果不存在,會拋出NoSuchFileException – 如果因目錄不為空而無法刪除檔案,會拋出 DirectoryNotEmptyException • 使用Files.deleteIfExists()方法也可 以刪除檔案,這個方法在檔案不存在時呼叫, 並不會拋出例外 42
  43. 43. 操作檔案與目錄 • 如果想要複製來源Path的檔案或目錄至目的地 Path,可以使用Files.copy()方法 – 第三個選項可以指定CopyOption介面的實作物件, CopyOption實作類別有以Enum型態實作的 StandardCopyOption與LinkOption – StandardCopyOption的REPLACE_EXISTING實例進 行複製時,若目標檔案已存在就會予以覆蓋, COPY_ATTRIBUTES會嘗試複製相關屬性 – LinkOption的NOFOLLOW_LINKS則不會跟隨符號連結 43
  44. 44. 操作檔案與目錄 • 一個使用Files.copy()的範例如下: • Files.copy()還有重載兩個版本 – 接受InputStream作為來源,可直接讀取資料, 並將結果複製至指定的Path中 – 將來源Path複製至指定的OutputStream 44
  45. 45. 操作檔案與目錄 • 可改寫10.1.1中的Download為以下: 45
  46. 46. 操作檔案與目錄 • 若要進行檔案或目錄移動,可以使用 Files.move()方法 • 如果要建立目錄,可以使用 Files.createDirectory()方法,如果呼叫時 父目錄不存在,會拋出NoSuchFileException • Files.createDirectories()會在父目錄不存 在時一併建立 • 如果要建立暫存目錄,可以使用Files. createTempDirectory()方法 46
  47. 47. 操作檔案與目錄 • 對於java.io中的基本輸入輸出API,NIO2 也作了封裝 – 可使用Files.readAllBytes()讀取整個檔案, 然後以byte[]傳回檔案內容 – 如果檔案內容都是字元,則可使用 Files.readAllLines()指定檔案Path與編 碼,讀取整個檔案,將檔案中每行收集在 List<String>中傳回 47
  48. 48. 操作檔案與目錄 • 如果本來有個建立BufferedReader的片段 如下: • 可使用Files.newBufferedReader()改 寫如下: 48
  49. 49. 操作檔案與目錄 • 如果想要以InputStream、 OutputStream處理檔案,也有對應的 Files.newInputStream()、 Files.newOutputStream()可以使用 49
  50. 50. 讀取、走訪目錄 • 如果想要取得檔案系統根目錄路徑資訊,可 以使用FileSystem的 getRootDirectories()方法 50
  51. 51. 讀取、走訪目錄 • 可以使用Files.newDirectoryStream() 方法取得DirectoryStream介面實作物件, 代表指定路徑下的所有檔案 • 在不使用DirectoryStream物件時必須使 用close()方法關閉相關資源 • DirectoryStream繼承了Closeable介面, 其父介面為AutoClosable介面,所以可搭 配嘗試關閉資源語法來簡化程式撰寫 51
  52. 52. 讀取、走訪目錄 • Files.newDirectoryStream()實際傳 回的是DirectoryStream<Path> • DirectoryStream也繼承了Iterable介 面,所以可使用增強式for迴圈語法來逐一 取得Path 52
  53. 53. 讀取、走訪目錄 53
  54. 54. 讀取、走訪目錄 • 如果想要走訪目錄中所有檔案與子目錄,可 以實作FileVisitor介面 54
  55. 55. 讀取、走訪目錄 55
  56. 56. 讀取、走訪目錄 • 可以繼承SimpleFileVisitor類別,這個 類別實作了FileVisitor介面,你只要繼 承之後重新定義感興趣的方法就可以了 56
  57. 57. 57
  58. 58. 讀取、走訪目錄 • 如果要使用FileVisitor走訪目錄,可以 使用Files.walkFileTree()方法: 58
  59. 59. 讀取、走訪目錄 • Files新增了list()與walk()靜態方法, 它傳回的是Stream<Path> • lines()、list()與walk()傳回的 Stream不使用時需要呼叫close()方法來 釋放資源 59
  60. 60. 過濾、搜尋檔案 • 想顯示.class與.jar檔案: • 像*.{class,jar}這樣的語法稱之為Glob 60
  61. 61. 過濾、搜尋檔案 61
  62. 62. 過濾、搜尋檔案 • *.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結尾。 62
  63. 63. 過濾、搜尋檔案 63
  64. 64. 過濾、搜尋檔案 • 如果Glob語法無法滿足條件過濾需求時,可 以自行實作DirectoryStream.Filter的 accept()方法自訂過濾條件 64
  65. 65. 過濾、搜尋檔案 • 可以使用FileSystem實例的 getPathMatcher()取得PathMatcher介 面實作物件 – 可以指定使用哪種模式比對語法,"regex"表示 使用規則表示式語法、"glob"表示Glob語法 65
  66. 66. 66
  • shengchehsiao

    Nov. 22, 2019
  • sunqihui

    Sep. 10, 2019
  • TonyZhang1217

    Apr. 22, 2019

認識NIO 使用Channel與Buffer 使用NIO2檔案系統

Views

Total views

566

On Slideshare

0

From embeds

0

Number of embeds

0

Actions

Downloads

71

Shares

0

Comments

0

Likes

3

×