91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java之Buffer屬性怎么用

發布時間:2021-08-09 13:45:11 來源:億速云 閱讀:209 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java之Buffer屬性怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、前言

熟悉NIO的人想必一定不會陌生buffer中position,limit,capacity這三個屬性吧,之前在學習的時候遇到一個問題:就是當你先往緩沖區寫入一部分數據,然后調用flip()方法,再全部讀取完數據,然后再調用flip()方法,此時這三個值的變化是怎樣的。

二、正文

1、介紹

  • position: 它指的是下一次讀取或寫入的位置。

  • limit: 指定還有多少數據需要寫出(在從緩沖區寫入通道時),或者還有多少空間可以讀入數據(在從通道讀入緩沖區時),它初始化是與capacity的值一樣,當調用flip()方法之后,它的值會改變成position的值,而position被置0。它箭頭所指的位置是最后一位元素的下一位所在的位置*

  • capacity: 指定了可以存儲在緩沖區中的最大數據容量,實際上,它指定了底層數組的大小,或者至少是指定了準許我們使用的底層數組的容量,這個初始化后就不會再改變了。

2、圖示

以上三個屬性值之間有一些相對大小的關系:0 <= position <= limit <= capacity。如果我們創建一個新的容量大小為7的ByteBuffer對象,在初始化的時候,position設置為0,limit和 capacity被設置為7,在以后使用ByteBuffer對象過程中,capacity的值不會再發生變化,而其它兩個個將會隨著使用而變化。三個屬性值分別如圖所示:

初始化:

Java之Buffer屬性怎么用

假設我們現在要往這個緩沖區里面寫入3個字節,寫完之后,position的箭頭就會指向3的位置,而limit不變:

Java之Buffer屬性怎么用

此時我們想從緩沖區讀取這3個字節,就必須調用flip()方法,調用了flip()方法過后,limit置為position的位置,而position被置為0,也正應證了上面所說的,position它指的是下一次讀取或寫入的位置,limit它箭頭所指的位置是最后一位元素的下一位所在的位置:

Java之Buffer屬性怎么用

現在我們可以調用get()方法,一直從緩沖區里面取數據,直到取完為止,也就是當position與limit的值一樣時,就取完了:

Java之Buffer屬性怎么用

這一次簡單的讀寫操作就完成了,如果想恢復成初始狀態的話,可以調用clear()方法:

Java之Buffer屬性怎么用

之前學到這里的時候有個疑問,不知道大家想過沒有,就是我們在調用了get()方法從緩沖區取完里面的數據,立馬去調用flip()方法,那這三個屬性的值會是什么變化?如果當我只讀了2個字節的數據之后,就不讀了,然后再去調用flip(),這三個值又會是怎么變化?其實不管怎么繞,你只要懂得原理,就不難,咱們先看flip()源代碼做了什么:

public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

這里不難發現,調用flip()方法,無非就是給這幾個變量賦值,將當前的position值賦給limit,然后將position的值置為0,Mark是一個標志變量,咱們以后會提到。熟悉以上代碼就不難解決我提出的2個問題:

  • 當你讀取完調用flip()的方法      positon:0    limit:3       capacity:7

  • 當你讀取2個字節之后調用flip()方法       positon:0    limit:2       capacity:7

這里就解決了我之前遇到的這三個屬性值變化的問題!!!

三、測試代碼

讀取完調用flip:

package com.cing.nio;
 
import java.io.FileInputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 
public class NioTest1 {
    public static void main(String[] args) throws Exception{
 
        FileInputStream fis = new FileInputStream("D:\\A.txt");
        FileChannel fc = fis.getChannel();
 
        ByteBuffer buffer = ByteBuffer.allocate(7);
        output("初始化", buffer);
 
        fc.read(buffer);
        output("調用READ方法", buffer);
 
        buffer.flip();
        output("第一次調用flip", buffer);
 
        while (buffer.remaining() > 0) {
            byte b = buffer.get();
        }
        output("get()", buffer);
 
        buffer.flip();
        output("第二次flip", buffer);
 
        fis.close();
    }
 
    public static void output(String step, Buffer buffer) {
        System.out.println(step + " : ");
        System.out.println("buffer: " + buffer + ", ");
    }
}

輸出結果為:

初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
調用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次調用flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7], 
get() : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=3 cap=7], 
第二次flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7],

讀取2字節之后調用flip:

package com.cing.nio;
 
import java.io.FileInputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
 
public class NioTest1 {
    public static void main(String[] args) throws Exception{
 
        FileInputStream fis = new FileInputStream("D:\\A.txt");
        FileChannel fc = fis.getChannel();
 
        ByteBuffer buffer = ByteBuffer.allocate(7);
        output("初始化", buffer);
 
        fc.read(buffer);
        output("調用READ方法", buffer);
 
        buffer.flip();
        output("第一次調用flip", buffer);
 
        while (buffer.remaining() > 1) {
            byte b = buffer.get();
        }
        output("get()", buffer);
 
        buffer.flip();
        output("第二次flip", buffer);
 
        fis.close();
    }
 
    public static void output(String step, Buffer buffer) {
        System.out.println(step + " : ");
        System.out.println("buffer: " + buffer + ", ");
    }
}

輸出結果為:

初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
調用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次調用flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=3 cap=7], 
get() : 
buffer: java.nio.HeapByteBuffer[pos=2 lim=3 cap=7], 
第二次flip : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=2 cap=7],

感謝各位的閱讀!關于“Java之Buffer屬性怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍邱县| 土默特左旗| 宣城市| 邓州市| 永仁县| 凤冈县| 湘阴县| 岳西县| 横山县| 武平县| 尖扎县| 大连市| 芒康县| 云霄县| 邛崃市| 石景山区| 什邡市| 读书| 沭阳县| 鄄城县| 东兴市| 曲松县| 阳江市| 伊宁县| 五家渠市| 崇明县| 青浦区| 锦州市| 砀山县| 兴海县| 松滋市| 兴安盟| 任丘市| 白银市| 娄烦县| 甘孜县| 江阴市| 延安市| 泗阳县| 旺苍县| 泊头市|