java nio 读取图片_给大忙人们看的 Java NIO 极简教程
作者 | JavaEdge
來源 | JavaEdge(ID:Java-Edge)
頭圖 | CSDN 下載自東方IC
Java NIO 的Buffer用于和NIO Channel(通道)交互。數據是從通道讀入緩沖區,從緩沖區寫入到通道中。
緩沖區本質上是塊可以寫入數據,再從中讀數據的內存。該內存被包裝成 NIO 的Buffer 對象,并提供了一系列方法,方便開發者訪問該塊內存。
基本用法
使用Buffer讀寫數據一般四步走:
寫數據到 Buffer
調用 buffer.flip()
從 Buffer 中讀取數據
調用clear()或compact()
當向 buffer 寫數據時,buffer 會記錄寫了多少數據。一旦要讀取數據,需通過flip()將 Buffer 從寫模式切到讀模式。在讀模式下,可讀之前寫到 buffer 的所有數據。
一旦讀完數據,就需要清空緩沖區,讓它可以再次被寫入。有兩種方式能清空緩沖區:調用 clear() 或 compact() 方法。
clear()會清空整個緩沖區
compact()只會清除已經讀過的數據。任何未讀數據都被移到緩沖區的起始處,新寫入的數據將放到緩沖區未讀數據的后面。
使用Buffer的示例
死磕三座大山:capacity、position、limit
1、讀寫模式下的示意圖
2、capacity
作為一個內存塊,Buffer有個固定大小,即capacity。你只能往里寫capacity個byte、long,char等。一旦Buffer滿,需將其清空(通過讀或清除數據)才能繼續往里寫數據。
3、position
取決于Buffer處在讀還是寫模式:
寫數據到Buffer時,position表示當前位置。初始的position值為0,當一個byte、long等數據寫到Buffer后, position會向前移動到下一個可插入數據的Buffer單元。所以position最大可為capacity–1。
讀數據時,也是從某特定位置讀。當將Buffer從寫模式切換到讀模式,position會被重置為0。當從Buffer的position處讀取數據時,position向前移動到下一個可讀的位置。
4、limit
寫模式下,表示最多能往Buffer寫多少數據。所以此時limit=capacity。
讀模式時, limit表示最多能讀到多少數據。
因此,當切換Buffer到讀模式時,limit會被設置成寫模式下的position值。即你能讀到之前寫入的所有數據(limit被設置成已寫數據的數量,這個值在寫模式下就是position)。
Buffer的類型
Java NIO Buffer有如下類型
這些Buffer類型代表了不同的數據類型,即可通過這些類型來操作緩沖區中的字節。
Buffer的分配
要想獲得一個Buffer對象首先要進行分配。每個Buffer類都有一個allocate方法。
1、分配48字節capacity的ByteBuffer的例子
2、分配一個可存儲1024個字符的CharBuffer
向Buffer中寫數據
寫數據到Buffer有兩種方式:
從Channel寫到Buffer
2. 通過Buffer的put()方法寫到Buffer里
put方法有很多版本,允許以不同方式把數據寫入到Buffer中。例如, 寫到一個指定的位置,或者把一個字節數組寫入到Buffer。
flip()方法
flip方法將Buffer從寫模式切換到讀模式。調用flip()方法會將position設回0,并將limit設置成之前position的值。
換句話說,position現在用于標記讀的位置,limit表示之前寫進了多少個byte、char等 —— 現在能讀取多少個byte、char等。
從Buffer讀數據
兩種方式:
1、從Buffer讀取數據到Channel。
int bytesWritten = inChannel.write(buf);
2、使用get()方法從Buffer中讀取數據。
byte aByte = buf.get();
get方法有很多版本,允許你以不同的方式從Buffer中讀取數據。例如,從指定position讀取,或者從Buffer中讀取數據到字節數組。
rewind()
Buffer.rewind()將position置0,所以可重讀Buffer中的所有數據。limit保持不變,仍表示能從Buffer中讀取多少個元素。
clear()與compact()方法
一旦讀完Buffer中的數據,需要讓Buffer準備好再次被寫入。通過clear()或compact()完成。
調用clear() position將被置0,limit被置成 capacity的值。即 Buffer 被清空。Buffer中的數據并未清除,只是這些標記告訴我們可以從哪里開始往Buffer寫數據。如果Buffer中有一些未讀數據,調用clear(),數據將“被遺忘”,意味著不再有任何標記會告訴你哪些數據被讀過,哪些還沒有。如果Buffer中仍有未讀的數據,且后續還想讀這些數據,但你需要先寫一些數據,那么使用compact()。
compact() 將所有未讀數據拷貝到Buffer起始處。然后將position設到最后一個未讀元素正后面。limit屬性依然像clear()方法一樣,設置成capacity?,F在Buffer準備好寫數據了,但是不會覆蓋未讀數據。
mark()與reset()方法
通過調用Buffer.mark()方法,可以標記Buffer中的一個特定position。之后可以通過調用Buffer.reset()方法恢復到這個position。例如:
buffer.mark();// call buffer.get() a couple of times, e.g. during parsing.buffer.reset();
equals()與compareTo()方法
可以使用equals()和compareTo()方法比較兩個Buffer。
equals()
當滿足下列條件時,表示兩個Buffer相等:
有相同的類型(byte、char、int等)
Buffer中剩余的byte、char等的個數相等
Buffer中所有剩余的byte、char等都相同。
equals只是比較Buffer的一部分,不是每一個在它里面的元素都比較。實際上,它只比較Buffer中的剩余元素。
compareTo()
compareTo()方法比較兩個Buffer的剩余元素(byte、char等), 如果滿足下列條件,則認為一個Buffer“小于”另一個Buffer:
第一個不相等的元素小于另一個Buffer中對應的元素
所有元素都相等,但第一個Buffer比另一個先耗盡(第一個Buffer的元素個數比另一個少)。
剩余元素是從 position到limit之間的元素。
參考
http://tutorials.jenkov.com/java-nio/buffers.html
總結
以上是生活随笔為你收集整理的java nio 读取图片_给大忙人们看的 Java NIO 极简教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱立信被罚74亿元 交付10亿美元和解
- 下一篇: php 接受数组_PHP接收前端发送的数