<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    java nio之Buffer(一)

    Posted on 2008-02-22 14:31 dennis 閱讀(6630) 評論(1)  編輯  收藏 所屬分類: java
        Buffer是一個包裝了基本數據元素數組的對象,它以及它的子類定義了一系列API用于處理數據緩存。

    一、屬性
    Buffer有四個基本屬性:
    1、capacity  容量,buffer能夠容納的最大元素數目,在Buffer創建時設定并不能更改
    2、limit buffer中有效位置數目
    3、position 下一個讀或者寫的位置
    4、mark  用于記憶的標志位,配合reset()使用,初始值未設定,調用mark后將當前position設為值

    四者關系:0 <= mark <= position <= limit <= capacity

    二、API

    package java.nio;
    public abstract class Buffer {
    public final int capacity( )
    public final int position( )
    public final Buffer position (int newPosition)
    public final int limit( )
    public final Buffer limit (int newLimit)
    public final Buffer mark( )
    public final Buffer reset( )
    public final Buffer clear( )
    public final Buffer flip( )
    public final Buffer rewind( )
    public final int remaining( )
    public final boolean hasRemaining( )
    public abstract boolean isReadOnly( );
    }

    支持鏈式調用,如:buffer.mark().position(5).reset( );
    注意isReadOnly()方法決定了buffer是否可寫。

    三、操作
      以ByteBuffer為例,
    1、訪問,通過get(),get(index),其中get()從當前position位置讀取,get(index)從index位置讀取,不改變當前position,下面要說到的put也一樣。
    2、填充,通過put(byte),put(index,byte),按照絕對位置填充也是不改變當前position屬性

    3、flipping,試想,我們將填充完畢的buffer傳遞給socket輸出,那么socket讀取是依據position屬性確定,就會從結尾后一位開始讀,這樣肯定是不正確的,如果要正確的讀取我們先要:
      buffer.limit(buffer.position( )).position(0);
    將limit設為position, 將position設為0,這個操作就叫flipping,API直接提供了這個操作:
      buffer.flip( );
    特別注意,flip()方法會改變limit屬性,將limit屬性從capacity設置為當前position。rewind()方法與flip()類似,但是僅將position設為0,而不改變limit,通常用于重新讀取已經被flip的buffer。flip()另一個注意點是,兩次調用buffer的flip方法,將使得position和limit屬性都為0。

    4、迭代取元素:
    for (int i = 0; buffer.hasRemaining( ), i++) {
    myByteArray [i] 
    = buffer.get( );
    }

    int count = buffer.remaining( );
    for (int i = 0; i < count, i++) {
    myByteArray [i] 
    = buffer.get( );
    }
    ByteBuffer不是線程安全的,前一種方式適合并發訪問,后一種方式效率更高。這兩種方式都是一個一個取,效率都比批量取低。

    5.clear()方法,將buffer重設為空狀態,也就是設置limit=capacity,position=0,以便重復利用。

    6.compact()方法,用于壓縮buffer,這個方法在多次重復調用時是比較低效。

    7.mark(),初始是未定義的,這適合如果調用reset將拋出InvalidMarkException。調用makr()后,將當前position設為mark以便reset時返回。注意,rewind( ), clear( ), and flip( )方法都將丟棄已經創建的mark。調用limit(index),positioon(index),如果index的值小于當前mark,mark也將被丟棄。

    8.比較,可以通過equals()和compateTo()方法來比較兩個buffer,前一個返回boolean,后一個返回0,-1,1。兩個buffer equal的條件是:
    1)類型相同
    2)剩余元素的數目相等
    3)剩余元素也一一相等

    9、批量移動數據,為了更有效地進行數據傳送,批量的數據存取肯定是不能少的,Buffer及其子類都有提供類似的方法,比如CharBuffer:
    public CharBuffer get (char [] dst)
    public CharBuffer get (char [] dst, int offset, int length)
    public final CharBuffer put (char[] src)
    public CharBuffer put (char [] src, int offset, int length)
    public CharBuffer put (CharBuffer src)
    public final CharBuffer put (String src)
    public CharBuffer put (String src, int start, int end)

    四、創建Buffer
        Buffer以及其子類都無法直接new,而必須把通過他們提供的工廠方法來創建。通常有兩種方式:
    1、allocate,例如
    CharBuffer charBuffer = CharBuffer.allocate (100);
    將在堆上分配一個可以存儲100個字符的數組作為backing store。

    2、wrap,包裝一個已有的數組:
    char [] myArray = new char [100];
    CharBuffer charbuffer = CharBuffer.wrap (myArray);
    注意,這樣的方式創建的Buffer,將不會在堆上創建新的數組,而是直接利用myArray做backing store,這意味著任何對myArray或者buffer的修改都將影響到buffer或者myArray。可以通過public final boolean hasArray( )方法來判斷是否擁有一個數組,通過array()方法取得這個數組。

    五、復制Buffer
       其實這個復制也是“淺拷貝”,通過duplicate()方法將返回一個新創建的buffer,這個新buffer與原來的Buffer共享數據,一樣的capacity,但是有自己的position、limit和mark屬性。通過asReadOnlyBuffer()方法復制的buffer與duplicate()類似,但是是只讀的,不能調用put。比較特別的是slice()方法,故名思議,類似切割一個Buffer出來,與duplicate類似,但是它將從原來Buffer的當前position開始,并且capacity等于原來Buffer的剩余元素數目,也就是(limit-position)。


    評論

    # re: java nio之Buffer(一)  回復  更多評論   

    2014-07-01 11:15 by jis117
    for (int i = 0; buffer.hasRemaining( ), i++) {
    myByteArray [i] = buffer.get( );
    }



    函數體中應該是buffer.get(i)?
    主站蜘蛛池模板: 亚洲人成网址在线观看| 亚洲国产精品成人AV无码久久综合影院| 国产V片在线播放免费无码| aa毛片免费全部播放完整| 国产色无码精品视频免费| 亚洲国产专区一区| 特级毛片aaaa级毛片免费| 在线aⅴ亚洲中文字幕| 亚洲一区二区三区深夜天堂| 精品亚洲成a人在线观看| 中文字幕在线观看免费| 特级做A爰片毛片免费69| 亚洲精品无码久久久| 日韩在线观看视频免费| 88av免费观看| 亚洲精品无码日韩国产不卡?V| 黄色毛片免费网站| 最新国产AV无码专区亚洲| 亚洲一卡二卡三卡| 大地资源在线观看免费高清| 亚洲丁香色婷婷综合欲色啪| 亚洲精华国产精华精华液好用 | 自拍日韩亚洲一区在线| 中国极品美軳免费观看| 亚洲国产精品线在线观看| 亚洲视频在线观看免费视频| 不卡精品国产_亚洲人成在线| 国产亚洲精品成人AA片| 免费91麻豆精品国产自产在线观看| 日韩免费视频观看| 亚洲黄色片免费看| 国产精品美女久久久免费 | 亚洲精品视频在线免费| 青柠影视在线观看免费高清| 亚洲国产成人va在线观看网址| 国产免费无码一区二区| va天堂va亚洲va影视中文字幕| 亚洲色一色噜一噜噜噜| 精品特级一级毛片免费观看| 精品国产精品久久一区免费式| 亚洲精品二三区伊人久久|