国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JAVA_NIO系列——Channel和Buffer詳解

leon / 2406人閱讀

摘要:是一個(gè)用來替代標(biāo)準(zhǔn)的新型數(shù)據(jù)傳遞方式,像現(xiàn)在分布式架構(gòu)中會(huì)經(jīng)常存在他的身影。這個(gè)方法會(huì)一直阻塞到某個(gè)注冊的通道有事件就緒。保持不變,仍然表示能從中讀取多少個(gè)元素等與通過調(diào)用方法,可以標(biāo)記中的一個(gè)特定。

Java NIO是一個(gè)用來替代標(biāo)準(zhǔn)Java IO API的新型數(shù)據(jù)傳遞方式,像現(xiàn)在分布式架構(gòu)中會(huì)經(jīng)常存在他的身影。其比傳統(tǒng)的IO更加高效,非阻塞,異步,雙向

NIO主體結(jié)構(gòu)

Java NIO的主要構(gòu)成核心就是Buffer、Channel和Selector這三個(gè)

對于Channel我想要提醒的是,Channel中的數(shù)據(jù)總是要先讀到一個(gè)Buffer,或者總是要從一個(gè)Buffer中寫入

使用Selector,得向Selector注冊Channel,然后調(diào)用它的select()方法。這個(gè)方法會(huì)一直阻塞到某個(gè)注冊的通道有事件就緒。一旦這個(gè)方法返回,線程就可以處理這些事件

Channel

所有的 IO 在NIO 中都從一個(gè)Channel 開始。Channel 有點(diǎn)象流

Channel的實(shí)現(xiàn)

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ù)器那樣。對每一個(gè)新進(jìn)來的連接都會(huì)創(chuàng)建一個(gè)SocketChannel

Scatter/Gather

分散(scatter)從Channel中讀取是指在讀操作時(shí)將讀取的數(shù)據(jù)寫入多個(gè)buffer中。因此,Channel將從Channel中讀取的數(shù)據(jù)“分散(scatter)”到多個(gè)Buffer中

聚集(gather)寫入Channel是指在寫操作時(shí)將多個(gè)buffer的數(shù)據(jù)寫入同一個(gè)Channel,因此,Channel 將多個(gè)Buffer中的數(shù)據(jù)“聚集(gather)”后發(fā)送到Channel

通過這樣的方式可以方便數(shù)據(jù)的讀取,當(dāng)你想要獲取整個(gè)數(shù)據(jù)的一部分的時(shí)候,通過這種方式可以很快的獲取數(shù)據(jù)

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);

read()方法按照buffer在數(shù)組中的順序?qū)腸hannel中讀取的數(shù)據(jù)寫入到buffer,當(dāng)一個(gè)buffer被寫滿后,channel緊接著向另一個(gè)buffer中寫

transferFrom、transferTo

實(shí)現(xiàn)兩個(gè)Channel之間相互連接,數(shù)據(jù)傳遞

    public static void trainforNio() {
        RandomAccessFile fromFile=null;
        RandomAccessFile toFile=null;
        try {

            fromFile = new RandomAccessFile("src/nio.txt", "rw");
            // channel獲取數(shù)據(jù)
            FileChannel fromChannel = fromFile.getChannel();
            toFile = new RandomAccessFile("src/toFile.txt", "rw");
            FileChannel toChannel = toFile.getChannel();
            System.out.println(toChannel.size());
              //position處開始向目標(biāo)文件寫入數(shù)據(jù),這里是toChannel
            long position = toChannel.size();
            long count = fromChannel.size();
            toChannel.transferFrom(fromChannel, position, count);
            System.out.println(toChannel.size());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fromFile != null) {
                    fromFile.close();
                }
                if (toFile != null) {
                    toFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

transferFrom、transferTo作用是一樣的,只是一個(gè)是tochannal調(diào)用,一個(gè)是fromchannnal調(diào)用

在實(shí)際的運(yùn)用中可能存在源通道的剩余空間小于 count 個(gè)字節(jié),則所傳輸?shù)淖止?jié)數(shù)要小于請求的字節(jié)數(shù)

在SoketChannel的實(shí)現(xiàn)中,SocketChannel只會(huì)傳輸此刻準(zhǔn)備好的數(shù)據(jù)(可能不足count字節(jié))。因此,SocketChannel可能不會(huì)將請求的所有數(shù)據(jù)(count個(gè)字節(jié))全部傳輸?shù)紽ileChannel中

看官一定要仔細(xì)看我栗子中的注釋

Buffer

Buffer是一個(gè)緩存區(qū),其會(huì)將Channel中的數(shù)據(jù)存儲(chǔ)起來

Buffer的實(shí)現(xiàn)

ByteBuffer

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

MappedByteBuffer

capacity,position,limit

在講解該主題之前,首先要明白讀模式和寫模式,無論是Channel還是Buffer都存在這兩種模式,要理解這兩種模式,第一步要明確主題是哪一個(gè),是Channel還是Buffer。舉個(gè)栗子,主角是Channel,讀模式的含義就是從Buffer中獲取數(shù)據(jù),寫模式就是將數(shù)據(jù)寫入Buffer,對于Buffer則是相反。搞清楚這一點(diǎn),理解下面的就要相對清楚一點(diǎn)

capacity:作為一個(gè)內(nèi)存塊,其就代表了當(dāng)前Buffer能最多暫存多少數(shù)據(jù)量,存儲(chǔ)的數(shù)據(jù)類型則是根據(jù)上面的Buffer對象類型,一旦Buffer滿了,需要將其清空(通過讀數(shù)據(jù)或者清除數(shù)據(jù))才能繼續(xù)寫數(shù)據(jù)往里寫數(shù)據(jù)

position:代表當(dāng)前數(shù)據(jù)讀或?qū)懱幱谀莻€(gè)位置。讀模式:被重置從0開始,最大值可能為capacity-1或者limit-1,寫模式:被重置從0開始,最大值為limit-1

limit:最多能往Buffer里寫多少數(shù)據(jù),limit大小跟數(shù)據(jù)量大小和capacity有關(guān),讀模式:數(shù)據(jù)量>capacity時(shí),limit=capacity,數(shù)據(jù)量=capacity時(shí),limit=capacity,數(shù)據(jù)量

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class Method {
    public static void nio() {
        RandomAccessFile aFile = null;
        try {

            aFile = new RandomAccessFile("src/nio.txt", "rw");
            // channel獲取數(shù)據(jù)
            FileChannel fileChannel = aFile.getChannel();
            // 初始化Buffer,設(shè)定Buffer每次可以存儲(chǔ)數(shù)據(jù)量
            // 創(chuàng)建的Buffer是1024byte的,如果實(shí)際數(shù)據(jù)本身就小于1024,那么limit就是實(shí)際數(shù)據(jù)大小
            ByteBuffer buf = ByteBuffer.allocate(1024);
            // channel中的數(shù)據(jù)寫入Buffer
            int bytesRead = fileChannel.read(buf);
            System.out.println(bytesRead);

            while (bytesRead != -1) {
                // Buffer切換為讀取模式
                buf.flip();
                // 讀取數(shù)據(jù)
                while (buf.hasRemaining()) {
                    System.out.print((char) buf.get());
                }
                // 清空Buffer區(qū)
                buf.compact();
                // 繼續(xù)將數(shù)據(jù)寫入緩存區(qū)
                bytesRead = fileChannel.read(buf);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (aFile != null) {
                    aFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        Method.nio();
    
Buffer讀寫數(shù)據(jù)步驟

寫入數(shù)據(jù)到Buffer(fileChannel.read(buf))

調(diào)用flip()方法(buf.flip())

從Buffer中讀取數(shù)據(jù)(buf.get())

調(diào)用clear()方法或者compact()方法(buf.compact())

Buffer方法

flip():將Buffer讀模式切換到寫模式,并且將position制為0

clear():清空整個(gè)緩沖區(qū)

compact():只會(huì)清除已經(jīng)讀過的數(shù)據(jù)。任何未讀的數(shù)據(jù)都被移到緩沖區(qū)的起始處,新寫入的數(shù)據(jù)將放到緩沖區(qū)未讀數(shù)據(jù)的后面

allocate(1024):初始化Buffer,設(shè)定的值就決定capacity值的大小

rewind():將position設(shè)回0,所以你可以重讀Buffer中的所有數(shù)據(jù)。limit保持不變,仍然表示能從Buffer中讀取多少個(gè)元素(byte、char等)

mark()與reset():通過調(diào)用Buffer.mark()方法,可以標(biāo)記Buffer中的一個(gè)特定position。之后可以通過調(diào)用Buffer.reset()方法恢復(fù)到這個(gè)position

equals():當(dāng)滿足下面三個(gè)條件時(shí),兩個(gè)Buffer才是相等

有相同的類型(byte、char、int等)

Buffer中剩余的byte、char等的個(gè)數(shù)相等

Buffer中所有剩余的byte、char等都相同

只比較的是剩余的數(shù)據(jù)

compareTo():滿足下列條件,則認(rèn)為一個(gè)Buffer“小于”另一個(gè)Buffer

第一個(gè)不相等的元素小于另一個(gè)Buffer中對應(yīng)的元素

所有元素都相等,但第一個(gè)Buffer比另一個(gè)先耗盡(第一個(gè)Buffer的元素個(gè)數(shù)比另一個(gè)少)

Selector

Selector允許單線程處理多個(gè) Channel。如果你的應(yīng)用打開了多個(gè)連接(通道),但每個(gè)連接的流量都很低,使用Selector就會(huì)很方便

關(guān)于selector的知識(shí)內(nèi)容比較多了,我打算在下一期進(jìn)行詳細(xì)說明

更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問AppZone網(wǎng)站

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

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

相關(guān)文章

  • JAVA_NIO詳細(xì)解析說明

    摘要:通道是和選擇器一起被注冊的,并且使用選擇器來更新通道的就緒狀態(tài)。注冊不會(huì)立即被取消,但鍵會(huì)立即失效。這個(gè)集合的每個(gè)成員都是相關(guān)的通道被選擇器在前一個(gè)選擇操作中判斷為已經(jīng)準(zhǔn)備好的,并且包 Java NIO是一個(gè)用來替代標(biāo)準(zhǔn)Java IO API的新型數(shù)據(jù)傳遞方式,像現(xiàn)在分布式架構(gòu)中會(huì)經(jīng)常存在他的身影。其比傳統(tǒng)的IO更加高效,非阻塞,異步,雙向 NIO主體結(jié)構(gòu) showImg(http:/...

    SillyMonkey 評論0 收藏0
  • JDK10都發(fā)布了,nio你了解多少?

    摘要:而我們現(xiàn)在都已經(jīng)發(fā)布了,的都不知道,這有點(diǎn)說不過去了。而對一個(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 評論0 收藏0
  • Java NIO詳解

    摘要:前言本篇主要講解中的機(jī)制和網(wǎng)絡(luò)通訊中處理高并發(fā)的分為兩塊第一塊講解多線程下的機(jī)制第二塊講解如何在機(jī)制下優(yōu)化資源的浪費(fèi)服務(wù)器單線程下的機(jī)制就不用我介紹了,不懂得可以去查閱下資料那么多線程下,如果進(jìn)行套接字的使用呢我們使用最簡單的服務(wù)器來幫助大 前言 本篇主要講解Java中的IO機(jī)制和網(wǎng)絡(luò)通訊中處理高并發(fā)的NIO 分為兩塊:第一塊講解多線程下的IO機(jī)制第二塊講解如何在IO機(jī)制下優(yōu)化CPU資...

    rickchen 評論0 收藏0
  • Java NIO 之 Buffer(緩沖區(qū))

    摘要:一緩沖區(qū)介紹用于和交互。的容量,位置,上限緩沖區(qū)實(shí)質(zhì)上就是一塊內(nèi)存,用于寫入數(shù)據(jù),也供后續(xù)再次讀取數(shù)據(jù)。在每個(gè)類中,方法用于分配緩沖區(qū)。沒有這句話會(huì)報(bào)錯(cuò)將此緩沖區(qū)的位置重置為先前標(biāo)記的位置。返回此緩沖區(qū)的限制。 一 Buffer(緩沖區(qū))介紹 Java NIO Buffers用于和NIO Channel交互。 我們從Channel中讀取數(shù)據(jù)到buffers里,從Buffer把數(shù)據(jù)寫入到...

    gitmilk 評論0 收藏0
  • Java NIO 的前生今世 之三 NIO Buffer 詳解

    摘要:當(dāng)我們需要與進(jìn)行交互時(shí)我們就需要使用到即數(shù)據(jù)從讀取到中并且從中寫入到中實(shí)際上一個(gè)其實(shí)就是一塊內(nèi)存區(qū)域我們可以在這個(gè)內(nèi)存區(qū)域中進(jìn)行數(shù)據(jù)的讀寫其實(shí)是這樣的內(nèi)存塊的一個(gè)封裝并提供了一些操作方法讓我們能夠方便地進(jìn)行數(shù)據(jù)的讀寫類型有這些覆蓋了能從中傳 Java NIO Buffer 當(dāng)我們需要與 NIO Channel 進(jìn)行交互時(shí), 我們就需要使用到 NIO Buffer, 即數(shù)據(jù)從 Buffe...

    madthumb 評論0 收藏0

發(fā)表評論

0條評論

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