更新時間:2022-03-29 10:53:31 來源:動力節(jié)點 瀏覽2073次
在 IO 之后,java 提供了新的 IO。這也稱為 NIO,從 JDK 1.4 開始引入。NIO 帶來了許多讀取和寫入文件、通道和套接字的功能。NIO API 有兩代,即 NIO.1 和 NIO.2。在 NIO.1 緩沖區(qū)中,引入了 charset 和 channels。在 JDK 7 中,NIO 框架引入了新的包 java.nio.file 等。這些被稱為 NIO.2 系列。它是 NIO 框架中的一個度量版本。NIO.2 提供了 Path、Files 等改變了 java 中文件處理方式的類?,F(xiàn)在我們將詳細了解 NIO 框架,我們提供了頁面鏈接以通過示例獲得更好的清晰度。

Java NIO 從緩沖區(qū)開始。緩沖區(qū)是數(shù)據(jù)的容器。java.nio 包包含所有緩沖區(qū) API。有數(shù)據(jù)類型特定的緩沖區(qū),如 ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer。java.nio.Buffer 是上面提到的所有數(shù)據(jù)類型緩沖區(qū)擴展的基類。緩沖區(qū)是任何特定原始類型的元素序列。緩沖區(qū)的基本屬性是它的容量、限制和位置,并且緩沖區(qū)不是線程安全的。
緩沖區(qū)容量
一個緩沖區(qū)包含的元素個數(shù)就是緩沖區(qū)的容量。緩沖區(qū)的容量不能為負,并且永遠不會改變。
緩沖區(qū)限制
這是未讀取或未寫入的第一個元素的索引。限制不能為負,也不能大于其容量。
緩沖區(qū)中的位置
它將被讀取或?qū)懭氲南乱粋€元素的索引。位置不能為負數(shù),也不能大于其限制。
在 Buffer 中標記和重置
在某些時候,通過調(diào)用 reset 方法來重置緩沖區(qū)的位置。該位置稱為標記。reset() 只能在定義了標記且標記未始終定義時調(diào)用。如果我們定義了一個標記,并且在某個時候我們將位置和限制調(diào)整為低于標記,那么標記將被丟棄。標記、極限、位置和容量之間的關(guān)系如下所示。
0 <= 標記 <= 位置 <= 限制 <= 容量
Java NIO Buffer中clear()方法的作用
clear() 方法使緩沖區(qū)準備好在讀取和相對放置操作中接受新流。它設置了容量限制,并且位置變?yōu)榱恪?/p>
java NIO Buffer中flip()方法的作用
flip() 方法使緩沖區(qū)在寫入和相關(guān)獲取操作的情況下準備就緒。它將限制設置為當前位置并且位置變?yōu)榱恪?/p>
Java NIO Buffer中rewind()方法的作用
rewind() 使緩沖區(qū)準備好從緩沖區(qū)重新讀取數(shù)據(jù)。在這種情況下,限制保持不變,位置變?yōu)榱恪?/p>
Java NIO 中的 BufferUnderflowException
在從當前位置開始的讀取操作中,位置會增加被傳輸元素的數(shù)量,如果請求的元素數(shù)量超過限制,則相對 get 操作會拋出未經(jīng)檢查的異常,即 java.nio。緩沖區(qū)下溢異常。
Java NIO 中的 BufferOverflowException
在寫入操作中,請求的元素被放入緩沖區(qū),如果超過限制,則 put 方法拋出未經(jīng)檢查的異常,即 java.nio.BufferOverflowException
現(xiàn)在找到一些 java.nio 包的 API。
ByteBuffer JDK 1.4 中引入了ByteBuffer。ByteBuffer 是字節(jié)的緩沖區(qū)。ByteBuffer 是抽象類,但它有靜態(tài)方法。
CharBuffer CharBuffer 是字符的緩沖區(qū)。CharBuffer 對象是通過調(diào)用 allocate() 創(chuàng)建的。
字符集 API 位于包 java.nio.charset 下。charset 的作用是字節(jié)序列和 16 位 unicode 字符之間的命名映射。java nio charsets API 中有編碼器和解碼器。我們一起稱它為編碼員。編碼器將字符轉(zhuǎn)換為字節(jié),解碼器將字節(jié)轉(zhuǎn)換為任何特定的字符集。
Charset Charset 在給定的 charset 和 UNICODE 之間起到編碼和解碼的作用。
CharsetDecoder 和 CharsetEncoder在 java 中,從一個字符集到另一個字符集的編碼和解碼可以使用 java NIO API 完成??梢詫⒕哂腥魏巫址?ByteBuffer 更改為 Unicode 字符集的 CharBuffer。
NIO 通道位于 java.nio.channels 包中。通道是與文件、套接字或任何硬件設備等實體的開放連接。通道可以異步關(guān)閉和中斷。有不同類型的渠道。
AsynchronousChannelGroup AsynchronousChannelGroup 在異步通道組中進行資源共享。
Pipe.SinkChannel 和 Pipe.SourceChannel Pipe 確保數(shù)據(jù)以與寫入 Pipe 相同的順序讀取。
FileLock FileLock 鎖定或嘗試鎖定文件的給定部分。
FileChannel FileChannel 保持一個可以修改的當前位置。
ReadableByteChannel通道返回 IO 類。ReadableByteChannel 由 Channels 獲取。newChannel(in) 通過傳遞輸入流。
在 JDK 7 中,NIO.2 已隨包 java.nio.file 一起引入。該 API 提供了訪問文件、文件屬性和文件系統(tǒng)的類。API文檔 支持符號鏈接,即任何文件位置的參考鏈接。通過 toPath() 方法可以實現(xiàn) File 和 Path 之間的互操作性。我們將討論 java.nio.file API 的一些類。
路徑和路徑 Path的用途是在文件系統(tǒng)中定位文件。Path 可以靈活地通過部分證明路徑來定位文件。
文件它可以創(chuàng)建和刪除目錄以及文件。它還在現(xiàn)有文件和鏈接目錄之間創(chuàng)建鏈接。
目錄流DirectoryStream 遍歷文件并返回每個文件的 Path 實例。DirectoryStream 必須在迭代后關(guān)閉,否則會出現(xiàn)資源泄漏。
WatchService WatchService 有責任觀察所有注冊對象的變化。只有 watchable 對象應該注冊到 watch 服務來監(jiān)控變化。
通過上述相信大家對Nio框架已經(jīng)有了一些了解,如果大家對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下動力節(jié)點的NIO視頻教程,里面的課程內(nèi)容通俗易懂,適合沒有基礎(chǔ)的小伙伴學習,希望對大家能夠有所幫助。