电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java之Buffer屬性案例詳解

瀏覽:5日期:2023-02-13 13:00:49
一、前言

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

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

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

初始化:

Java之Buffer屬性案例詳解

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

Java之Buffer屬性案例詳解

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

Java之Buffer屬性案例詳解

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

Java之Buffer屬性案例詳解

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

Java之Buffer屬性案例詳解

之前學到這里的時候有個疑問,不知道大家想過沒有,就是我們在調(diào)用了get()方法從緩沖區(qū)取完里面的數(shù)據(jù),立馬去調(diào)用flip()方法,那這三個屬性的值會是什么變化?如果當我只讀了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()方法,無非就是給這幾個變量賦值,將當前的position值賦給limit,然后將position的值置為0,Mark是一個標志變量,咱們以后會提到。熟悉以上代碼就不難解決我提出的2個問題:

當你讀取完調(diào)用flip()的方法      positon:0    limit:3       capacity:7 當你讀取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的知識學起來還是比較有趣的,期待下次與大家分享這塊的知識!

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

標簽: Java
相關文章:
主站蜘蛛池模板: 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 轻型地埋电缆故障测试仪,频响法绕组变形测试仪,静荷式卧式拉力试验机-扬州苏电 | 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 杭州ROHS检测仪-XRF测试仪价格-百科| 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 广州昊至泉水上乐园设备有限公司 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 27PR跨境电商导航 | 专注外贸跨境电商| 爆炸冲击传感器-无线遥测传感器-航天星百科 | 截齿|煤截齿|采煤机截齿|掘进机截齿|旋挖截齿-山东卓力截齿厂家报价 | 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 中矗模型-深圳中矗模型设计有限公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 四川成人高考_四川成考报名网| 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 |