<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 **緩沖區(buffer): 存儲數據的** **通道(channel): 代表數據源與目標節點之間的連接,負責緩沖區的傳輸** Buffer就像一個數組,可以保存多個相同類型的數據.根據數據類型不同(boolean除外),有以下Buffer常用子類 ![](https://img.kancloud.cn/56/db/56dba22ed9bcc053147560a6a739c562_692x278.png) 上面的Buffer類,他們都采用相似的方法進行管理數據,只是各自管理的數據類型不同而已. 都是通過各自類的如下方法獲取一個Buffer對象 ~~~ //創建一個容量為capacity的XxxxBuffer對象 static XxxBuffer allocate(int capacity) ~~~ **緩沖區的基本屬性** * 容量(capacity): 表示Buffer最大數據容量,一旦聲明后,不能更改,通過Buffer中的capacity()獲取.緩沖區capacity不能為負 * 限制(limit): 第一個不應該讀取或寫入的數據的索引,即位于limit后的數據不可讀寫.通過Buffer中的limit()獲取.緩沖區的limit不能為負,并且不能大于其capacity * 位置(position): 當前要讀取或寫入數據的索引.通過Buffer中position()獲取.緩沖區的position不能為負,并且不能大于其limit,下一個要讀取或寫入的數據的索引。 * 標記(mark): 標記是一個索引,通過Buffer中的mark()方法將mark標記為當前position位置.之后可以通過調用reset()方法將position恢復到標記的mark處 遵守以下公式 ~~~ 0 <= mark <= position <= limit <= capacity ~~~ ## 緩沖區(Buffer) 通過上面NIO與普通IO的主要區別也可以看到在基本的IO操作中所有的操作都是基于流進行操作的,而在NIO中所有的操作都是基于緩沖區繼續操作的,所有的讀寫操作都是通過緩存區來進行完成,緩沖區(Buffer)是一個線性的、有序的數據集,只能容納特定的數據類型(基本就是基本數據類型對應的Buffer或者起子類)。 ### 各數據類型的緩存區類 ![](https://box.kancloud.cn/d7f4d636e61f46c59390db857fd94f48_511x346.png) 備注:看到上面這幾類是不是想起了JAVA的8種基本數據類型,唯一缺少boolean對于的類型。 第一問:為什么boolean不需要緩存呢? 可以查閱之前寫的:java二進制相關基礎,里面有描述規范中數字的內部表示和存儲, boolean所占位數1bit(取值只有true或者false), 由于字節(byte)是操作系統和所有I/O設備使用的基本數據類型, 所以基本都是以字節或者連續的一段字節來存儲表示, 所以就沒有boolean,感覺也沒有必要boolean類型的緩存操作 ### Buffer使用 **讀數據:** * flip()方法 * 將Buffer從寫模式切換到讀模式 * **調用flip()方法會將position設回0**,并將limit設置成之前position的值。 * buf.flip(); * buf.get() * 讀取數據 * Buffer.rewind() * 將position設回0,所以你可以重讀Buffer中的所有數據 * limit保持不變,仍然表示能從Buffer中讀取多少個元素(byte、char等) * Buffer.mark()方法,可以標記Buffer中的一個特定position。之后可以通過調用。 * Buffer.reset()方法,恢復到Buffer.mark()標記時的position。 * clear()方法會: * 清空整個緩沖區。 * position將被設回0,limit被設置成 capacity的值 * compact()方法: * 只會清除已經讀過的數據;任何未讀的數據都被移到緩沖區的起始處,新寫入的數據將放到緩沖區未讀數據的后面。 * 將position設到最后一個未讀元素正后面,limit被設置成 capacity的值。 **寫數據**:buf.put(127); ### Buffer其他方法 ![](https://img.kancloud.cn/30/39/303965485b8061c03e7b446d53e8c071_975x624.png) ### 緩沖區的基本屬性 ![](https://box.kancloud.cn/57f76684a9eec30d90b791b144c55f57_925x291.png) ![](https://img.kancloud.cn/57/4b/574ba217fd97876635fdf3cba6b6404c_927x650.png) ~~~ //第一步,獲取IntBuffer,通過IntBuffer.allocate操作 IntBuffer buf = IntBuffer.allocate(10) ; // 準備出10個大小的緩沖區 //第二步未操作前輸出屬性值 System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ; //第三步進行設置數據 buf.put(6) ; // 設置一個數據 buf.put(16) ; // 設置二個數據 //第四步操作后輸出屬性值 System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ; //第五步將Buffer從寫模式切換到讀模式 postion = 0 ,limit = 原本position buf.flip() ; //第六步操作后輸出屬性值 System.out.println("position = " + buf.position() + ",limit = " + buf.limit() + ",capacty = " + buf.capacity()) ; ~~~ 程序輸出結果: ~~~ position = 0,limit = 10,capacty = 10 position = 2,limit = 10,capacty = 10 position = 0,limit = 2,capacty = 10 ~~~ # 直接與非直接緩沖區 ~~~ 物理磁盤->內核地址空間->用戶地址空間->應用程序 OS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-> ? ? ? ? ? ? ? ? ? ? ? ? ? JVM 直接緩沖區 內核地址空間和用戶地址空間之間形成了一個物理內存映射文件,減少了之間的copy過程。 存在風險: 用于不易控制 GC ~~~ ![](https://img.kancloud.cn/4b/ee/4beecb868dfce0fac20a3129ba0a337c_788x376.png) ![](https://img.kancloud.cn/1c/85/1c85ae285f692eea6b21137c7c74c974_776x498.png) * 字節緩沖區要么是直接的,要么是非直接的.如果為直接字節緩沖區,則java虛擬機會盡最大努力直接在此緩沖區上執行本機IO操作.也就是說,在每次調用基礎操作系統的一個本機IO操作之前(或之后),虛擬機都會盡量避免將緩沖區的內容復制到中間緩存區(或從中間緩沖區中復制內容) * 直接字節緩沖區可以通過調用ByteBuffer的allocateDirect()工廠方法來創建.此方法返回緩沖區進行分配和取消分配所需要成本通常高于非直接緩沖區.直接緩沖區的內容可以駐留在常規垃圾回收堆之外.因此,他們對應用程序內存需求量造成的影響可能并不明顯.所以,建議將直接緩沖區主要分配給哪些易受基礎系統的本機IO操作影響的大型,持久的緩沖區.一般情況下,最好在直接緩沖區能在程序性能方面帶來明顯好處的時候使用他們 * 直接字節緩沖區還可以通過FileChannel的map()方法將文件區域直接映射到內存中創建.該方法返回ByteBuffer的子類:MappedByteBuffer.java平臺的實現有助于通過JNI從本機代碼創建直接字節緩沖區.如果以上這些緩沖區中的某個緩沖區實例指的是不可訪問的內存區域,則試圖訪問該區域不會更改該緩沖區的內容,并且將會在訪問期間或稍后的某個時間導致拋出不確定的異常 * 字節緩沖區是直接緩存區還是非直接緩沖區可通過調用其isDirect()方法來確定.提供此方法是為了能夠在性能關鍵型代碼中執行顯示緩沖區管理
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看