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