<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一、前言
      熟悉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的值不會再發生變化,而其它兩個個將會隨著使用而變化。三個屬性值分別如圖所示:

      初始化:

       

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

           

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

       

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

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

      之前學到這里的時候有個疑問,不知道大家想過沒有,就是我們在調用了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],

       

      posted on 2019-05-23 09:59  友帥老師  閱讀(358)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 天天看片视频免费观看| 国产精久久一区二区三区| 美乳丰满人妻无码视频| 中文字幕乱码中文乱码毛片| 国产成人啪精品视频免费APP| 国产超级va在线观看视频| 日韩狼人精品在线观看| av综合亚洲一区二区| 无码国模国产在线观看免费| 成人年无码av片在线观看| 国产精品视频免费一区二区| 国产乱子伦视频在线播放| 日本无遮挡吸乳呻吟视频| 国产精品自拍视频第一页| 日韩精品一区二区都可以| 国产va免费精品观看精品| 色噜噜一区二区三区| 国产一区二区在线激情往| 一本大道无码av天堂| 四虎永久精品在线视频| 成人啪啪高潮不断观看| 尤物视频色版在线观看| 久久精品无码免费不卡| 亚洲AV成人片在线观看| 在线播放国产精品亚洲| 亚洲日本精品一区二区| 国产最大成人亚洲精品| 一个人在看www免费| 97人人添人人澡人人澡人人澡| 一区二区三区鲁丝不卡| 99在线精品国自产拍中文字幕| 久久精品无码专区免费东京热 | 116美女极品a级毛片| 精品日韩人妻中文字幕| 国产成人精品2021欧美日韩| 成人动漫综合网| 97成人碰碰久久人人超级碰oo| 久久午夜私人影院| 99在线精品免费视频| 人妻中文字幕亚洲一区| 国产极品精品自在线不卡|