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

More Related Content

PDF
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
PPTX
SQL Server Integration Services
PPTX
KeycloakでFAPIに対応した高セキュリティなAPIを公開する
PPTX
OCIコンテナサービス関連の技術詳細
PDF
Oracle Integration Cloud 概要(20200507版)
PDF
ETL VS ELT.pdf
PPTX
Database Concepts and Components
PPTX
Intro to Azure Data Factory v1
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
SQL Server Integration Services
KeycloakでFAPIに対応した高セキュリティなAPIを公開する
OCIコンテナサービス関連の技術詳細
Oracle Integration Cloud 概要(20200507版)
ETL VS ELT.pdf
Database Concepts and Components
Intro to Azure Data Factory v1

What's hot (20)

PDF
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
PPTX
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
PDF
Azure Synapse Analytics
PDF
Google App Engine
PPT
Cloud Computing
PPTX
私はここでつまづいた! Oracle database 11g から 12cへのアップグレードと Oracle Database 12c の新機能@201...
PDF
Voice over IP (VoIP) Deployment with Aruba Mobility Access Switch
PPTX
Cloud-Computing-ppt.pptx
PDF
Get Mainframe Data to Snowflake’s Cloud Data Warehouse
PPTX
What is ETL?
PPTX
Introduction to hadoop and hdfs
PPTX
Amazon AWS & IAAS
PPTX
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
PPTX
はじめてのElasticsearchクラスタ
PPTX
Hive on Spark の設計指針を読んでみた
PPTX
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
PPTX
Azure Data Factory
PPTX
徳丸本に載っていないWebアプリケーションセキュリティ
PPTX
Network Virtualization
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
Azure Synapse Analytics
Google App Engine
Cloud Computing
私はここでつまづいた! Oracle database 11g から 12cへのアップグレードと Oracle Database 12c の新機能@201...
Voice over IP (VoIP) Deployment with Aruba Mobility Access Switch
Cloud-Computing-ppt.pptx
Get Mainframe Data to Snowflake’s Cloud Data Warehouse
What is ETL?
Introduction to hadoop and hdfs
Amazon AWS & IAAS
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
はじめてのElasticsearchクラスタ
Hive on Spark の設計指針を読んでみた
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
Azure Data Factory
徳丸本に載っていないWebアプリケーションセキュリティ
Network Virtualization
Ad

Viewers also liked (20)

PPT
Java SE 8 技術手冊第 10 章 - 輸入輸出
PPT
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
PPT
Java SE 8 技術手冊第 12 章 - Lambda
PPT
Java SE 8 技術手冊第 1 章 - Java平台概論
PPT
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
PPT
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
PPT
Java SE 8 技術手冊第 8 章 - 例外處理
PPT
Java SE 8 技術手冊第 16 章 - 整合資料庫
PPT
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
PPT
Java SE 8 技術手冊第 13 章 - 時間與日期
PPT
Java SE 8 技術手冊第 7 章 - 介面與多型
PPT
Java SE 8 技術手冊第 4 章 - 認識物件
PPT
Java SE 8 技術手冊第 5 章 - 物件封裝
PPT
Java SE 8 技術手冊第 3 章 - 基礎語法
PPT
Java SE 8 技術手冊第 6 章 - 繼承與多型
PPT
Java SE 8 技術手冊第 15 章 - 通用API
PPT
Java SE 8 技術手冊第 9 章 - Collection與Map
PDF
從 REPL 到 IDE
PDF
JDK8 Functional API
PDF
進階主題
Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 12 章 - Lambda
Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 8 章 - 例外處理
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 13 章 - 時間與日期
Java SE 8 技術手冊第 7 章 - 介面與多型
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 3 章 - 基礎語法
Java SE 8 技術手冊第 6 章 - 繼承與多型
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 9 章 - Collection與Map
從 REPL 到 IDE
JDK8 Functional API
進階主題
Ad

Similar to Java SE 8 技術手冊第 14 章 - NIO 與 NIO2 (12)

PDF
NIO 與 NIO2
PDF
CH14:NIO 與 NIO2
PDF
千呼萬喚始出來的 Java SE 7
PPTX
Java_05:檔案輸出輸入機制
ODP
Java 網路程式
PDF
Java SE 7 技術手冊投影片第 12 章 - 通用API
PDF
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
PPT
千呼萬喚始出來的Java SE 7
PDF
2006 recycle opensourceprojects
PDF
Recycle Open Source Projects
PDF
輸入輸出
PPT
SCJP ch16
NIO 與 NIO2
CH14:NIO 與 NIO2
千呼萬喚始出來的 Java SE 7
Java_05:檔案輸出輸入機制
Java 網路程式
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
千呼萬喚始出來的Java SE 7
2006 recycle opensourceprojects
Recycle Open Source Projects
輸入輸出
SCJP ch16

More from Justin Lin (20)

PPTX
Ch14 簡介 Spring Boot
PPTX
Ch13 整合 Spring MVC/Security
PPTX
Ch12 Spring 起步走
PPTX
Ch11 簡介 JavaMail
PPTX
Ch10 Web 容器安全管理
PPTX
Ch09 整合資料庫
PPTX
Ch08 自訂標籤
PPTX
Ch07 使用 JSTL
PPTX
Ch06 使用 JSP
PPTX
Ch05 Servlet 進階 API、過濾器與傾聽器
PPTX
Ch04 會話管理
PPTX
Ch03 請求與回應
PPTX
Ch02 撰寫與設定 Servlet
PPTX
CH1. 簡介 Web 應用程式
PDF
14. 進階主題
PDF
13.並行、平行與非同步
PDF
12. 除錯、測試與效能
PDF
11. 常用內建模組
PDF
10. 資料永續與交換
PDF
9. 資料結構
Ch14 簡介 Spring Boot
Ch13 整合 Spring MVC/Security
Ch12 Spring 起步走
Ch11 簡介 JavaMail
Ch10 Web 容器安全管理
Ch09 整合資料庫
Ch08 自訂標籤
Ch07 使用 JSTL
Ch06 使用 JSP
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch04 會話管理
Ch03 請求與回應
Ch02 撰寫與設定 Servlet
CH1. 簡介 Web 應用程式
14. 進階主題
13.並行、平行與非同步
12. 除錯、測試與效能
11. 常用內建模組
10. 資料永續與交換
9. 資料結構

Java SE 8 技術手冊第 14 章 - NIO 與 NIO2