成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA NIO.1

Steve_Wang_ / 2266人閱讀

摘要:特點(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()//是否有元素未處理,即position
Channel

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和流的區(qū)別

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/rw

Channel常用方法:

將文件映射到內(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)
字符集和Charset

JAVA默認(rèn)使用Unicode編碼,但是有些操作系統(tǒng)不適用Unicode。

方法
獲取支持的所有字符集
SortedMap=Charset.availableCharsets()

獲取charset實(shí)例
charset=Charset.forName("gbk")

編解碼
charbuffer=charset.decode(bytebuffer)
bytebuffer=charset.encoce(charbuffer/string)
文件鎖(進(jìn)程級(jí))

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

相關(guān)文章

  • JDK10都發(fā)布了,nio你了解多少?

    摘要:而我們現(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)在整理的過程已...

    YFan 評(píng)論0 收藏0
  • java-netty-Netty in Action 5th-ch1-Netty and Java

    摘要:一個(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è)中間層的抽象 ...

    LeviDing 評(píng)論0 收藏0
  • JAVA新生】nio attach引發(fā)的問題

    摘要:理由是如果到了上,而這個(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 ...

    ruicbAndroid 評(píng)論0 收藏0
  • 通用文件服務(wù)組件(HTTP實(shí)現(xiàn)版本)

    摘要:上篇文章介紹了通用文件服務(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)...

    TANKING 評(píng)論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 集成 Thymeleaf(五)

    摘要:數(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...

    姘存按 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<