日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java nio 读取图片_给大忙人们看的 Java NIO 极简教程

發布時間:2025/4/5 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。現在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 极简教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。