成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JAVA NIO.1

Steve_Wang_ / 2317人閱讀

摘要:特點面向塊的傳統(tǒng)是面向流的。有四個基本屬性容量,能夠容納的最大元素數(shù)目,在創(chuàng)建時設(shè)定并不能更改中有效位置數(shù)目,不能對超過中的區(qū)域進行讀寫。與緩沖區(qū)不同,通道主要由接口指定。方法獲取支持的所有字符集獲取實例編解碼文件鎖進程級支持文件鎖定功能。

簡介

NIO的所有類都被放在java.nio包或其子包下。

特點

面向塊的I/O:傳統(tǒng)JavaIO是面向流的I/O。流I/O一次處理一個字節(jié)。NIO中引入了緩沖區(qū)(Buffer)的概念,緩沖區(qū)作為傳輸數(shù)據(jù)的基本單位塊,所有對數(shù)據(jù)的操作都是基于將數(shù)據(jù)移進/移出緩沖區(qū)而來。

非阻塞的I/O + 就緒性選擇:非阻塞I/O則允許線程在有數(shù)據(jù)的時候處理數(shù)據(jù),沒有數(shù)據(jù)的時候干點別的,提高了資源利用率。就緒性選擇通常是建立在非阻塞的基礎(chǔ)上,并且更進一步,它把檢查哪些I/O請求的數(shù)據(jù)準(zhǔn)備好這個任務(wù)交給了底層操作系統(tǒng),操作系統(tǒng)會去查看并返回結(jié)果集合,這樣我們只需要關(guān)心那些準(zhǔn)備好進行操作的IO通道。

文件鎖定和內(nèi)存映射文件等操作系統(tǒng)特性:內(nèi)存映射利用虛擬內(nèi)存技術(shù)提供對文件的高速緩存,使讀取磁盤文件就像從內(nèi)存中讀取一樣高效,但是卻不會有內(nèi)存泄漏的危險,因為在內(nèi)存中不會存在文件的完整拷貝。

Buffer 簡介

Buffer有Byte、Short、Int、Long、Float、DoubleBuffer六個類別,起緩存作用。
Buffer有四個基本屬性:
  1、capacity 容量,buffer能夠容納的最大元素數(shù)目,在Buffer創(chuàng)建時設(shè)定并不能更改
  2、limit buffer中有效位置數(shù)目,不能對超過limit中的區(qū)域進行讀寫。
  3、position 下一個讀或者寫的位置
  4、mark 用于記憶的標(biāo)志位,配合reset()使用,初始值未設(shè)定,調(diào)用mark后將當(dāng)前position設(shè)為值

利用Buffer讀寫數(shù)據(jù),通常遵循四個步驟:

獲取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ù)據(jù)。。與緩沖區(qū)不同,通道API主要由接口指定。不同的操作系統(tǒng)上通道實現(xiàn)(Channel Implementation)會有根本性的差異,所以通道API僅僅描述了可以做什么。因此很自然地,通道實現(xiàn)經(jīng)常使用操作系統(tǒng)的本地代碼。通道接口允許您以一種受控且可移植的方式來訪問底層的I/O服務(wù)。

Channel和流的區(qū)別

Channel可以將整個文件或文件的一部分映射成為buffer

Channel是一個對象,可以通過它讀取和寫入數(shù)據(jù)。拿 NIO 與原來的 I/O 做個比較,通道就像是流。所有數(shù)據(jù)都通過 Buffer 對象來處理。您永遠不會將字節(jié)直接寫入通道中,相反,您是將數(shù)據(jù)寫入包含一個或者多個字節(jié)的緩沖區(qū)。同樣,您不會直接從通道中讀取字節(jié),而是將數(shù)據(jù)從通道讀入緩沖區(qū),再從緩沖區(qū)獲取這個字節(jié)。

既可以從通道中讀取數(shù)據(jù),又可以寫數(shù)據(jù)到通道。但流的讀寫通常是單向的。

通道可以異步地讀寫。

通道中的數(shù)據(jù)總是要先讀到一個 Buffer,或者總是要從一個 Buffer 中寫入。

FileChannel對象是線程安全(thread-safe)的。

常用的Channel

FileChannel:從文件中讀寫數(shù)據(jù)。
DatagramChannel:能通過UDP讀寫網(wǎng)絡(luò)中的數(shù)據(jù)。
SocketChannel:能通過TCP讀寫網(wǎng)絡(luò)中的數(shù)據(jù)。
ServerSocketChannel:可以監(jiān)聽新進來的TCP連接,像Web服務(wù)器那樣。對每一個新進來的連接都會創(chuàng)建一個SocketChannel。

使用

所有Channel都應(yīng)該使用傳統(tǒng)的流來構(gòu)建,如:FileChannel channel=fileInputStream.getChannel().
RandomAccessFile也有這個方法,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)

移動Channel的positon
channel.position(long length)
字符集和Charset

JAVA默認(rèn)使用Unicode編碼,但是有些操作系統(tǒng)不適用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學(xué)習(xí)筆記---Channel

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/67913.html

相關(guān)文章

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

    摘要:而我們現(xiàn)在都已經(jīng)發(fā)布了,的都不知道,這有點說不過去了。而對一個的讀寫也會有響應(yīng)的描述符,稱為文件描述符,描述符就是一個數(shù)字,指向內(nèi)核中的一個結(jié)構(gòu)體文件路徑,數(shù)據(jù)區(qū)等一些屬性。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來我預(yù)想是先來回顧一下傳統(tǒng)的IO模式的,將傳統(tǒng)的IO模式的相關(guān)類理清楚(因為IO的類很多)。 但是,發(fā)現(xiàn)在整理的過程已...

    YFan 評論0 收藏0
  • java-netty-Netty in Action 5th-ch1-Netty and Java

    摘要:一個多路復(fù)用器可以負(fù)責(zé)成千上萬的通道,沒有上限。不需要通過對多路復(fù)用器對注冊的通道進行輪詢操作即可實現(xiàn)異步讀寫,從而簡化編程模型。同時,支持支持如果是怎么辦最后,到目前位置,支持不支持二無法擴展作為的核心,無法擴展,私有構(gòu)造函數(shù)。 前言 netty 學(xué)習(xí) 基于 netty in action 5th, 官網(wǎng)資料,網(wǎng)絡(luò)博客等 1.1 Why Netty? netty 是一個中間層的抽象 ...

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

    摘要:理由是如果到了上,而這個對應(yīng)的操作遲遲不能就緒被出來。但我認(rèn)為這其實是一個超時處理問題。問題是,原生的是沒有超時支持的。如果是回調(diào)性質(zhì)的,一般的做法是正常就緒給一個,超時給另外一個。只要時間合理,作者之前所說的會引發(fā)的問題并不會出現(xiàn)。 grizzly框架的作者曾經(jīng)提到NIO框架不應(yīng)該使用selection key的attach功能(鏈接)。理由是如果attach到了selection ...

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

    摘要:上篇文章介紹了通用文件服務(wù)組件實現(xiàn)版本,本文介紹基于與的方式實現(xiàn)。根據(jù)官網(wǎng)信息可知,它是一個高性能,可為我們的應(yīng)用提供文件上傳服務(wù)的組件。程序可通過該對象獲取服務(wù)器的響應(yīng)內(nèi)容。 上篇文章介紹了通用文件服務(wù)組件(Netty實現(xiàn)版本),本文介紹基于HTTP與Apache FileUpload的方式實現(xiàn)。代碼地址:https://github.com/landy8530/... 1. 實現(xiàn)...

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

    摘要:數(shù)據(jù)和信息是不可分離的,數(shù)據(jù)是信息的表達,信息是數(shù)據(jù)的內(nèi)涵。數(shù)據(jù)本身沒有意義,數(shù)據(jù)只有對實體行為產(chǎn)生影響時才成為信息。主要目標(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...

    姘存按 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<