1. 程式人生 > >玩轉 Java Nio 第一章 buffer相關

玩轉 Java Nio 第一章 buffer相關

Java nio是jdk1.4增加的新的IO,Nio比起位元組、字元流用起來更簡潔,效率更高。和nio相關的JDK主要是java.nio和java.nio.x。
Buffer是nio的核心類之一,顧名思義就是緩衝區,它是一個抽象類,用來儲存資料或作為資料的中轉站。Buffer的子類主要有一下7個:

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

但是一般只有ByteBuffer和CharBuffer是常用。
ByteBuffer類主要屬性:

  1. mark:緩衝區的位置標記。
  2. position:緩衝區的位置
  3. limit:緩衝區的限制
  4. capacity:緩衝區的容量
  5. isReadOnly:只讀標記
  6. nativeByteOrder:排序標記
  7. offset:偏移量
    下面是Buffer的建構函式,
    Buffer(int paramInt1, int paramInt2, int paramInt3, int paramInt4) {
        if (paramInt4 < 0)
            throw new IllegalArgumentException("Negative capacity: " + paramInt4);
        this
.capacity = paramInt4; limit(paramInt3); position(paramInt2); if (paramInt1 < 0) return; if (paramInt1 > paramInt2) throw new IllegalArgumentException("mark > position: (" + paramInt1 + " > " + paramInt2 + ")"); this.mark = paramInt1; }

我們能從中得到前四個屬性的關係:
0<=mark<=position<=limit<=capacity,
一旦這四個屬性不符合這個關係,你的程式碼就會丟擲IllegalArgumentException。

除了上面屬性的getter和setter方法ByteBuffer的主要方法:
- get(int index) 和 getX (X代表java的包裝型別) :獲取緩衝區中的內容。
- put(byte b) 和 putX : 將資料存入緩衝區。
- slice() :建立新的位元組緩衝區,其內容是此緩衝區內容的共享子序列。
- wrap(byte[] array) :將 byte 陣列包裝到緩衝區中。
- clear() 使緩衝區為一系列新的通道讀取或相對放置 操作做好準備:它將限制設定為容量大小,將位置設定為 0。
- flip() 使緩衝區為一系列新的通道寫入或相對獲取 操作做好準備:它將限制設定為當前位置,然後將位置設定為 0。
- rewind() 使緩衝區為重新讀取已包含的資料做好準備:它使限制保持不變,將位置設定為 0。
clear的原始碼:

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

如果你的緩衝區位置關係當時是這樣的:
這裡寫圖片描述
當你使用clear後將會變成這樣:
這裡寫圖片描述

很容易理解吧,所以在你讀取資料前最好clear下你的緩衝區,以便給出足夠的空間儲存資料。

flip()的原始碼

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

如果你的緩衝區位置關係當時是這樣的:
這裡寫圖片描述
當你使用flip後將會變成這樣:
這裡寫圖片描述

在寫入資料前filp()下你的緩衝區能有效的寫入資料,這是非常有必要的。

下面是一個使用ByteBuffer的測試例子:

        ByteBuffer byteBuffer = ByteBuffer.allocate(127);
        System.out.println("position value:"+byteBuffer.position());
        System.out.println("limit value:"+byteBuffer.limit());
        System.out.println("capacity value:"+byteBuffer.capacity());
        for (int i = 0; i < byteBuffer.capacity(); i++) {
             byteBuffer.put((byte)i);
        }
        System.out.println("position value:"+byteBuffer.position());
        System.out.println("limit value:"+byteBuffer.limit());
        System.out.println("capacity value:"+byteBuffer.capacity());

        for (int i = 0; i < byteBuffer.capacity(); i++) {
             System.out.println(byteBuffer.get(i));
        }

然後下面是一部分輸出結果:
*position value:0
limit value:127
capacity value:127
position value:127
limit value:127
capacity value:127
0
1
*

byteBuffer.flip();

使用flip()之後的輸出結果:
*after flip buffer —-
position value:0
limit value:127
capacity value:127*

clear就交給大家自己去測試了,相信你會有所收穫的!
buffer的位元組還可以根據ByteOrder中BIG_ENDIAN
和LITTLE_ENDIAN 常量進行排序,這種排序講起來還是比較複雜的,想了解的請自行查閱相關資料。

以上純屬個人對Buffer的理解,如有紕漏,望留言指正或傳送到郵箱[email protected]

相關推薦

Java Nio 第一 buffer相關

Java nio是jdk1.4增加的新的IO,Nio比起位元組、字元流用起來更簡潔,效率更高。和nio相關的JDK主要是java.nio和java.nio.x。 Buffer是nio的核心類之一,顧名思義就是緩衝區,它是一個抽象類,用來儲存資料或作為資料的中轉

java基礎第一

int() 自動 mil 首字母 大寫 高級編程 out main ont 1、java是一種面向對象的高級編程語言。 2、java包括: javase(java基礎) javaee(java企業級應用) 一、用記事本編寫java程序 1.創建擴展名為.ja

實戰系列之 Node.js Java

liunx array github cal ddn 公眾 當前 eth pan 這些年以來,Node.js的興起,JavaScript已經從當年的“世界最被誤解的語言”變成了“世界最流行的語言”。且其發展之勢,從語言本身的進

Go Web 編程 第一 Web相關概念

spa 應用 web服務器 reason 用途 每次 rip stat .com 第一章 Go與Web應用 Go學習群:415660935 1.1 Web應用 在計算機的世界裏,應用(application)是一個與用戶進行交互,並完成用戶特定任務的軟件程序。而Web應用則

java基礎 第一上(安裝 配置java、簡單dos命令)

目錄 環境 文件中 blog 命令 下載安裝 path 屏幕 java基礎 一、安裝 配置java 下載安裝 1.java官網下載jdk(32位或者64位根據自己電腦而定)。 2.雙擊jdk.exe文件安裝。 環境變

java基礎 第一下(java格式,基本類型,運算符)

public 基本數據類型 整型 byte als pos ati 引號 body 一、java基本格式 public class demo1{ //類名要和文件名相同 public static void main(String[

Java NIO系列(二) - Buffer

ava adf get() con eap 本質 close 方法 rtb 前言 在Java NIO中,緩沖區用來臨時存儲數據,可以理解為是I/O操作中數據暫存的中轉站。緩沖區直接為通道(Channel)服務,數據是從通道讀入緩沖區,從緩沖區寫入到通道中的。 緩沖區本質上

九大工具助你Java性能優化

www 優化 pat file tools strong pro n) 包含 在這篇文章中,我會帶著大家一起看一下9個可以幫助我們優化Java性能的工具。有一些我們已經在IDR Solutions中使用了,而另外一些有可能在個人項目中使用。 NetBeans Profil

資料結構——第二:棧和佇列

內容概覽: 棧和棧的應用:撤銷操作和系統棧 棧的基本實現 棧的另外一個應用:括號匹配 關於Leetcode的更多說明 陣列佇列 迴圈佇列 迴圈佇列的實現 陣列佇列和迴圈佇列的比較 2-1.棧(Stack) 棧也是一種線性結構

Java NIO之緩衝區Buffer分析

目錄 Buffer介紹 ByteBuffer介紹 ByteBuffer案例 總結 Buffer介紹 1.Buffer簡介       緩衝區(Buffer)是中NIO中基礎的內容,存在於包java.nio下面.一個Buffer物件可以看做

JAVA SE 第一

第一章 計算機、程式和JAVA概述 1.1什麼是計算機 ※中央處理器 中央處理器是一塊超大規模的積體電路,是一臺計算機的運算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。 ※位元和位元組 二進位制數系統中,每個

六天帶你mysql資料庫--第一天(下)

這是一系列視訊學習,寫部落格也是方便自己之後複習,有大家需要的資料可以給個參考。 接上一篇:https://blog.csdn.net/aaaaaab_/article/details/80015589 原資料表: 修改欄位: alter table 表名 mo

Java NIO中的Buffer詳解

Java NIO中的Buffer用於和NIO通道進行互動。如你所知,資料是從通道讀入緩衝區,從緩衝區寫入到通道中的。 緩衝區本質上是一塊可以寫入資料,然後可以從中讀取資料的記憶體。這塊記憶體被包裝成NIO Buffer物件,並提供了一組方法,用來方便的訪問該塊記憶體。 下面是NIO Buff

Java NIO 緩衝區(Buffer) 學習筆記

  一、緩衝區(Buffer):在 Java NIO 中負責資料的存取。緩衝區就是陣列。用於儲存不同資料型別的資料      根據資料型別不同(boolean 除外),提供了相應型別的緩衝區:       ByteB

JAVA基礎第一-初識java

業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 從今天開始,我將會持續更新java基礎知識,歡迎關注。   java的誕生 說起java的由來也許也是一個比較有意思的事情。20世紀90年代,硬體領域出現了單片式計

JAVA基礎第二-java三大特性:封裝、繼承、多型 JAVA基礎第一-初識java

業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 我將會持續更新java基礎知識,歡迎關注。   往期章節: JAVA基礎第一章-初識java      

JAVA基礎第三-類與物件、抽象類、介面 JAVA基礎第一-初識java JAVA基礎第二-java三大特性:封裝、繼承、多型

 業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 我將會持續更新java基礎知識,歡迎關注。   往期章節: JAVA基礎第一章-初識java JAVA基礎第二章-java三大特

JAVA基礎第四-集合框架Collection篇 JAVA基礎第一-初識java JAVA基礎第二-java三大特性:封裝、繼承、多型 JAVA基礎第三-類與物件、抽象類、介面 記一次list迴圈刪除元素的突發事件!

 業內經常說的一句話是不要重複造輪子,但是有時候,只有自己造一個輪子了,才會深刻明白什麼樣的輪子適合山路,什麼樣的輪子適合平地! 我將會持續更新java基礎知識,歡迎關注。   往期章節: JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性

21個專案深度學習 第二 CIFAR10

首先介紹第一個檔案infar10_input.py,用途:在tensorflow中讀取人CIFAR-10訓練圖片。 這個IMAGE_SIZE=24並不是原始圖片的大小,而是接下來要裁剪成的大小 IMAGE_SIZE = 24 NUM_CLASSES = 10 NU

Java NIO(一)緩衝區Buffer

Java NIO全稱Java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,為所有的原始型別(Boolean型別除外)提供快取支援的資料容器,使用它可以提供非阻塞式的高伸縮性網路。 下表總結了Java IO和NIO之間的主要區別: