欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之Buffer屬性案例詳解

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

一、前言

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

二、正文

1、介紹

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

2、圖示

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

初始化:

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

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

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

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

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

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

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

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

這里就解決了我之前遇到的這三個(gè)屬性值變化的問(wèn)題!?。?/p>

三、測(cè)試代碼

讀取完調(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的知識(shí)學(xué)起來(lái)還是比較有趣的,期待下次與大家分享這塊的知識(shí)!

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

相關(guān)文章

  • 如何用Java實(shí)現(xiàn)排列組合算法

    如何用Java實(shí)現(xiàn)排列組合算法

    本文主要介紹了如何用Java實(shí)現(xiàn)排列組合算法,對(duì)算法感興趣的同學(xué),可以參考一下,理解其原理,并且試驗(yàn)一下。
    2021-05-05
  • Java收集的雪花算法代碼詳解

    Java收集的雪花算法代碼詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)雪花算法的詳細(xì)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)

    SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java IO流常用字節(jié)字符流原理解析

    Java IO流常用字節(jié)字符流原理解析

    這篇文章主要介紹了Java IO流常用字節(jié)字符流原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java漢字轉(zhuǎn)拼音案例詳解

    Java漢字轉(zhuǎn)拼音案例詳解

    這篇文章主要介紹了Java漢字轉(zhuǎn)拼音案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java?8?中?Function?接口使用方法介紹

    Java?8?中?Function?接口使用方法介紹

    這篇文章主要介紹了Java?8中?Function接口使用方法介紹,Java8中提供了一個(gè)函數(shù)式接口Function,這個(gè)接口表示對(duì)一個(gè)參數(shù)做一些操作然后返回操作之后的值
    2022-06-06
  • Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot提供了一些工具和框架,可以幫助我們輕松地實(shí)現(xiàn)分布式任務(wù)調(diào)度,在本文中我們將介紹如何使用Spring?Boot、Spring?Cloud、Quartz和Redis來(lái)實(shí)現(xiàn)分布式任務(wù)調(diào)度,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Spring Boot Gradle發(fā)布war到tomcat的方法示例

    Spring Boot Gradle發(fā)布war到tomcat的方法示例

    本篇文章主要介紹了Spring Boot Gradle發(fā)布war到tomcat的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • spring boot 使用profile來(lái)分區(qū)配置的操作

    spring boot 使用profile來(lái)分區(qū)配置的操作

    這篇文章主要介紹了spring boot使用profile來(lái)分區(qū)配置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java 語(yǔ)句塊的使用詳解及實(shí)例

    java 語(yǔ)句塊的使用詳解及實(shí)例

    這篇文章主要介紹了java 用語(yǔ)句塊的正確方法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論