最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之Buffer屬性案例詳解

 更新時間:2021年08月09日 09:52:01   作者:pengjunlee  
這篇文章主要介紹了Java之Buffer屬性案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

一、前言

熟悉NIO的人想必一定不會陌生buffer中position,limit,capacity這三個屬性吧,之前在學(xué)習(xí)的時候遇到一個問題:就是當(dāng)你先往緩沖區(qū)寫入一部分?jǐn)?shù)據(jù),然后調(diào)用flip()方法,再全部讀取完數(shù)據(jù),然后再調(diào)用flip()方法,此時這三個值的變化是怎樣的,研究了一下,決定寫下來分享一下。

二、正文

1、介紹

  • position: 它指的是下一次讀取或?qū)懭氲奈恢谩?/li>
  • limit: 指定還有多少數(shù)據(jù)需要寫出(在從緩沖區(qū)寫入通道時),或者還有多少空間可以讀入數(shù)據(jù)(在從通道讀入緩沖區(qū)時),它初始化是與capacity的值一樣,當(dāng)調(diào)用flip()方法之后,它的值會改變成position的值,而position被置0。它箭頭所指的位置是最后一位元素的下一位所在的位置*
  • capacity: 指定了可以存儲在緩沖區(qū)中的最大數(shù)據(jù)容量,實際上,它指定了底層數(shù)組的大小,或者至少是指定了準(zhǔn)許我們使用的底層數(shù)組的容量,這個初始化后就不會再改變了。

2、圖示

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

初始化:

假設(shè)我們現(xiàn)在要往這個緩沖區(qū)里面寫入3個字節(jié),寫完之后,position的箭頭就會指向3的位置,而limit不變:

此時我們想從緩沖區(qū)讀取這3個字節(jié),就必須調(diào)用flip()方法,調(diào)用了flip()方法過后,limit置為position的位置,而position被置為0,也正應(yīng)證了上面所說的,position它指的是下一次讀取或?qū)懭氲奈恢茫琹imit它箭頭所指的位置是最后一位元素的下一位所在的位置:

現(xiàn)在我們可以調(diào)用get()方法,一直從緩沖區(qū)里面取數(shù)據(jù),直到取完為止,也就是當(dāng)position與limit的值一樣時,就取完了:

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

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

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

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

  • 當(dāng)你讀取完調(diào)用flip()的方法      positon:0    limit:3       capacity:7
  • 當(dāng)你讀取2個字節(jié)之后調(diào)用flip()方法       positon:0    limit:2       capacity:7

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

三、測試代碼

讀取完調(diào)用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("調(diào)用READ方法", buffer);
 
        buffer.flip();
        output("第一次調(diào)用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 + ", ");
    }
}
 
 

輸出結(jié)果為:

初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
調(diào)用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次調(diào)用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字節(jié)之后調(diào)用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("調(diào)用READ方法", buffer);
 
        buffer.flip();
        output("第一次調(diào)用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 + ", ");
    }
}
 

輸出結(jié)果為:

初始化 : 
buffer: java.nio.HeapByteBuffer[pos=0 lim=7 cap=7], 
調(diào)用READ方法 : 
buffer: java.nio.HeapByteBuffer[pos=3 lim=7 cap=7], 
第一次調(diào)用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], 

NIO的知識學(xué)起來還是比較有趣的,期待下次與大家分享這塊的知識!

到此這篇關(guān)于Java之Buffer屬性案例詳解的文章就介紹到這了,更多相關(guān)Java之Buffer屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot項目打包成jar運行的二種方法

    Spring boot項目打包成jar運行的二種方法

    這篇文章主要給大家介紹了關(guān)于Spring boot項目打包成jar運行的二種方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java中MessageDigest來實現(xiàn)數(shù)據(jù)加密的方法

    Java中MessageDigest來實現(xiàn)數(shù)據(jù)加密的方法

    這篇文章主要介紹了Java中MessageDigest來實現(xiàn)數(shù)據(jù)加密的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • javaCV視頻處理之提取人像視頻

    javaCV視頻處理之提取人像視頻

    這篇文章主要介紹了利用JavaCV實現(xiàn)提取視頻中的人像并保存為視頻,文中的示例代碼講解詳細,對我們學(xué)習(xí)JavaCV有一定的幫助,需要的可以參考一下
    2021-12-12
  • SpringBoot+Swagger-ui自動生成API文檔

    SpringBoot+Swagger-ui自動生成API文檔

    今天小編就為大家分享一篇關(guān)于SpringBoot+Swagger-ui自動生成API文檔,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 隱藏idea的.idea和.mvn文件的解決方案

    隱藏idea的.idea和.mvn文件的解決方案

    這篇文章主要介紹了隱藏idea的.idea和.mvn文件的解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java 方法與數(shù)組基礎(chǔ)使用詳解

    java 方法與數(shù)組基礎(chǔ)使用詳解

    Java語言中的“方法”(Method)在其他語言當(dāng)中也可能被稱為“函數(shù)”(Function),數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java 語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04
  • 關(guān)于IDEA MybatisX插件的使用小技巧

    關(guān)于IDEA MybatisX插件的使用小技巧

    這篇文章主要介紹了關(guān)于MybatisX插件的使用小技巧,MybatisX是IDEA的一款第三方插件,可以極大地提升我們的開發(fā)效率,一起來看看吧
    2023-03-03
  • springboot啟動后卡住無日志的幾種情況小結(jié)

    springboot啟動后卡住無日志的幾種情況小結(jié)

    這篇文章主要介紹了springboot啟動后卡住無日志的幾種情況小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java8?Stream大數(shù)據(jù)量List分批處理切割方式

    java8?Stream大數(shù)據(jù)量List分批處理切割方式

    這篇文章主要介紹了java8?Stream大數(shù)據(jù)量List分批處理切割方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • springmvc4+hibernate4分頁查詢功能實現(xiàn)

    springmvc4+hibernate4分頁查詢功能實現(xiàn)

    本篇文章主要介紹了springmvc4+hibernate4分頁查詢功能實現(xiàn),Springmvc+hibernate成為現(xiàn)在很多人用的框架整合,有興趣的可以了解一下。
    2017-01-01

最新評論

金寨县| 东海县| 台南县| 吴堡县| 杨浦区| 保亭| 犍为县| 郎溪县| 英吉沙县| 汝城县| 华蓥市| 隆子县| 合江县| 黄冈市| 鸡西市| 施秉县| 南木林县| 绥宁县| 兴文县| 桓仁| 九寨沟县| 汕头市| 十堰市| 乐至县| 肥东县| 禄劝| 阳曲县| 桃江县| 琼结县| 剑阁县| 改则县| 巩留县| 双峰县| 漳州市| 彩票| 上饶县| 江西省| 芦溪县| 兰溪市| 韩城市| 靖州|