摘要:特點面向塊的傳統是面向流的。有四個基本屬性容量,能夠容納的最大元素數目,在創建時設定并不能更改中有效位置數目,不能對超過中的區域進行讀寫。與緩沖區不同,通道主要由接口指定。方法獲取支持的所有字符集獲取實例編解碼文件鎖進程級支持文件鎖定功能。
簡介
NIO的所有類都被放在java.nio包或其子包下。
特點面向塊的I/O:傳統JavaIO是面向流的I/O。流I/O一次處理一個字節。NIO中引入了緩沖區(Buffer)的概念,緩沖區作為傳輸數據的基本單位塊,所有對數據的操作都是基于將數據移進/移出緩沖區而來。
非阻塞的I/O + 就緒性選擇:非阻塞I/O則允許線程在有數據的時候處理數據,沒有數據的時候干點別的,提高了資源利用率。就緒性選擇通常是建立在非阻塞的基礎上,并且更進一步,它把檢查哪些I/O請求的數據準備好這個任務交給了底層操作系統,操作系統會去查看并返回結果集合,這樣我們只需要關心那些準備好進行操作的IO通道。
文件鎖定和內存映射文件等操作系統特性:內存映射利用虛擬內存技術提供對文件的高速緩存,使讀取磁盤文件就像從內存中讀取一樣高效,但是卻不會有內存泄漏的危險,因為在內存中不會存在文件的完整拷貝。
Buffer 簡介Buffer有Byte、Short、Int、Long、Float、DoubleBuffer六個類別,起緩存作用。
Buffer有四個基本屬性:
1、capacity 容量,buffer能夠容納的最大元素數目,在Buffer創建時設定并不能更改
2、limit buffer中有效位置數目,不能對超過limit中的區域進行讀寫。
3、position 下一個讀或者寫的位置
4、mark 用于記憶的標志位,配合reset()使用,初始值未設定,調用mark后將當前position設為值
利用Buffer讀寫數據,通常遵循四個步驟:
方法:獲取buffer
把數據寫入buffer;
調用flip;
從Buffer中讀取數據;
調用buffer.clear()或者buffer.compact()
獲取: static xxxBuffer allocate(int capacity)//創建容量為capacity的buffer 寫入: void putxxx(xxx f) void putxxx(int index, xxx f) void flip()//limit=position,position=0 //方便讀取數據 讀取: xxx getFloat() xxx getFloat(int index) void clear()//position=0,limit=capacity,方便再次裝入數據 其他方法: int capacity()//獲取capacity boolean hasRemaining()//是否有元素未處理,即positionChannel Channel和流的區別Channel用于在字節緩沖區和位于通道另一側的實體(通常是一個文件或套接字)之間有效地傳輸數據。。與緩沖區不同,通道API主要由接口指定。不同的操作系統上通道實現(Channel Implementation)會有根本性的差異,所以通道API僅僅描述了可以做什么。因此很自然地,通道實現經常使用操作系統的本地代碼。通道接口允許您以一種受控且可移植的方式來訪問底層的I/O服務。
Channel可以將整個文件或文件的一部分映射成為buffer
Channel是一個對象,可以通過它讀取和寫入數據。拿 NIO 與原來的 I/O 做個比較,通道就像是流。所有數據都通過 Buffer 對象來處理。您永遠不會將字節直接寫入通道中,相反,您是將數據寫入包含一個或者多個字節的緩沖區。同樣,您不會直接從通道中讀取字節,而是將數據從通道讀入緩沖區,再從緩沖區獲取這個字節。
既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
通道可以異步地讀寫。
通道中的數據總是要先讀到一個 Buffer,或者總是要從一個 Buffer 中寫入。
FileChannel對象是線程安全(thread-safe)的。
常用的Channel使用FileChannel:從文件中讀寫數據。
DatagramChannel:能通過UDP讀寫網絡中的數據。
SocketChannel:能通過TCP讀寫網絡中的數據。
ServerSocketChannel:可以監聽新進來的TCP連接,像Web服務器那樣。對每一個新進來的連接都會創建一個SocketChannel。所有Channel都應該使用傳統的流來構建,如:FileChannel channel=fileInputStream.getChannel().
RandomAccessFile也有這個方法,Channel是可讀還是可寫,取決于它的打開方式r/rwChannel常用方法:
將文件映射到內存 ByteBuffer buffer=channel.map(FileChannel.MapMode.READ_ONLY,0,file.length); 寫到Channel channel.write(buffer) 讀取到buffer channel.read(byteBuffer) 移動Channel的positon channel.position(long length)字符集和CharsetJAVA默認使用Unicode編碼,但是有些操作系統不適用Unicode。
方法獲取支持的所有字符集 SortedMap文件鎖(進程級)=Charset.availableCharsets() 獲取charset實例 charset=Charset.forName("gbk") 編解碼 charbuffer=charset.decode(bytebuffer) bytebuffer=charset.encoce(charbuffer/string) FileLock支持文件鎖定功能。在FileChannel中提供lock和tryLock方法來獲得FileLock對象。
fileLock可以只鎖定文件的一部分。lock(long position , long size,boolean shared)//阻塞式
tryLock(long position ,long sized,boolean shared)//非阻塞FileLock lock=fileChannel.tryLock(); dosomething..... lock.release();文件鎖是JVM持有的,如果兩個進程運行在同一個JVM,則他們不能對同一個文件加鎖。
Java NIO學習筆記---Channel
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67913.html
摘要:而我們現在都已經發布了,的都不知道,這有點說不過去了。而對一個的讀寫也會有響應的描述符,稱為文件描述符,描述符就是一個數字,指向內核中的一個結構體文件路徑,數據區等一些屬性。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來我預想是先來回顧一下傳統的IO模式的,將傳統的IO模式的相關類理清楚(因為IO的類很多)。 但是,發現在整理的過程已...
摘要:一個多路復用器可以負責成千上萬的通道,沒有上限。不需要通過對多路復用器對注冊的通道進行輪詢操作即可實現異步讀寫,從而簡化編程模型。同時,支持支持如果是怎么辦最后,到目前位置,支持不支持二無法擴展作為的核心,無法擴展,私有構造函數。 前言 netty 學習 基于 netty in action 5th, 官網資料,網絡博客等 1.1 Why Netty? netty 是一個中間層的抽象 ...
摘要:理由是如果到了上,而這個對應的操作遲遲不能就緒被出來。但我認為這其實是一個超時處理問題。問題是,原生的是沒有超時支持的。如果是回調性質的,一般的做法是正常就緒給一個,超時給另外一個。只要時間合理,作者之前所說的會引發的問題并不會出現。 grizzly框架的作者曾經提到NIO框架不應該使用selection key的attach功能(鏈接)。理由是如果attach到了selection ...
摘要:上篇文章介紹了通用文件服務組件實現版本,本文介紹基于與的方式實現。根據官網信息可知,它是一個高性能,可為我們的應用提供文件上傳服務的組件。程序可通過該對象獲取服務器的響應內容。 上篇文章介紹了通用文件服務組件(Netty實現版本),本文介紹基于HTTP與Apache FileUpload的方式實現。代碼地址:https://github.com/landy8530/... 1. 實現...
摘要:數據和信息是不可分離的,數據是信息的表達,信息是數據的內涵。數據本身沒有意義,數據只有對實體行為產生影響時才成為信息。主要目標是為開發提供天然的模板,并且能在里面準確的顯示。目前是自然更加推薦。 這是泥瓦匠的第105篇原創 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...
閱讀 1058·2021-11-12 10:34
閱讀 985·2021-09-30 09:56
閱讀 668·2019-08-30 15:54
閱讀 2602·2019-08-30 11:14
閱讀 1465·2019-08-29 16:44
閱讀 3203·2019-08-29 16:35
閱讀 2489·2019-08-29 16:22
閱讀 2441·2019-08-29 15:39