精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讓我們一起玩轉(zhuǎn) ByteBuffer

開發(fā) 前端
Buffer 存在的目的是為了減少與設(shè)備(例如磁盤)的交互頻率,在之前的博客中也提到過「磁盤的讀寫是很昂貴的操作」。

[[442736]]

本文轉(zhuǎn)載自微信公眾號「SH的全棧筆記」,作者SH的全棧筆記。轉(zhuǎn)載本文請聯(lián)系SH的全棧筆記公眾號。

為什么要講 Buffer

首先為什么一個小小的 Buffer 我們需要單獨拎出來聊?或者說,Buffer 具體是在哪些地方被用到的呢?

例如,我們從磁盤上讀取一個文件,并不是直接就從磁盤加載到內(nèi)存中,而是首先會將磁盤中的數(shù)據(jù)復(fù)制到內(nèi)核緩沖區(qū)中,然后再將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū)內(nèi),在圖里看起來就是這樣:

從磁盤讀取文件

再比如,我們往磁盤上寫文件,也不是直接將數(shù)據(jù)寫到磁盤。而是將數(shù)據(jù)從用戶緩沖區(qū)寫到內(nèi)核緩沖區(qū),由操作系統(tǒng)擇機將其刷入磁盤,圖跟上面這個差不多,就不畫了,自行理解。

再再比如,服務(wù)器接受客戶端發(fā)過來的數(shù)據(jù)時,也不是直接到用戶態(tài)的 Buffer 中。而是會先從網(wǎng)卡到內(nèi)核態(tài)的 Buffer 中,再從內(nèi)核態(tài)的 Buffer 中復(fù)制到用戶態(tài)的 Buffer 中。

那為什么要這么麻煩呢?復(fù)制來復(fù)制去的,首先我們用排除法排除這樣做是為了好玩。

Buffer 存在的目的是為了減少與設(shè)備(例如磁盤)的交互頻率,在之前的博客中也提到過「磁盤的讀寫是很昂貴的操作」。那昂貴在哪里呢?簡單來說,和設(shè)備的交互(例如和磁盤的IO)會設(shè)計到操作系統(tǒng)的中斷。中斷需要保存之前的進(jìn)程運行的上下文,中斷結(jié)束之后又需要恢復(fù)這個上下文,并且還涉及到內(nèi)核態(tài)和用戶態(tài)的切換,總體上是個耗時的操作。

看到這里,不熟悉操作系統(tǒng)的話可能會有點疑惑。例如:

  • 啥是用戶態(tài)
  • 啥是內(nèi)核態(tài)

大家可以去看看我之前寫的文章 《簡單聊聊用戶態(tài)和內(nèi)核態(tài)的區(qū)別》

Buffer 的使用

我們通過 Java 中 NIO 包中實現(xiàn)的 Buffer 來給大家講解,Buffer 總共有 7 種實現(xiàn),就包含了 Java 中實現(xiàn)的所有數(shù)據(jù)類型。

Buffer的種類 (1)

本篇文章中,我們使用的是 ByteBuffer,其常用的方法都有:

  • put
  • get
  • flip
  • rewind
  • mark
  • reset
  • clear

接下來我們就通過實際的例子來了解這些方法。

put

put 就是往 ByteBuffer 里寫入數(shù)據(jù),其有有很多重載的實現(xiàn):

  1. public ByteBuffer put(ByteBuffer src) {...} 
  2.  
  3. public ByteBuffer put(byte[] src, int offset, int length) {...} 
  4.  
  5. public final ByteBuffer put(byte[] src) {...} 

我們可以直接傳入 ByteBuffer 對象,也可以直接傳入原生的 byte 數(shù)組,還可以指定寫入的 offset 和長度等等。接下來看個具體的例子:

  1. public static void main(String[] args) { 
  2.     ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.     buffer.put(new byte[]{'s','h'}); 

為了能讓大家更直觀的看出 ByteBuffer 內(nèi)部的情況,我將它整理成了圖的形式。當(dāng)上面的代碼運行完之后 buffer 的內(nèi)部長這樣:

put

當(dāng)你嘗試使用 System.out.println(buffer) 去打印變量 buffer 的時候,你會看到這樣的結(jié)果:

  1. java.nio.HeapByteBuffer[pos=2 lim=16 cap=16] 

圖里、控制臺里都有 position 和 limit 變量,capacity 大家能理解,就是我們創(chuàng)建這個 ByteBuffer 的制定的大小 16。

而至于另外兩個變量,相信大家從圖中也可以看出來,position 變量指向的是下一次要寫入的下標(biāo),上面的代碼我們只寫入了 2 個字節(jié),所以 position 指向的是 2,而這個 limit 就比較有意思了,這個在后面的使用中結(jié)合例子一起講。

get

get 是從 ByteBuffer 中獲取數(shù)據(jù)。

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s','h'}); 
  4.   System.out.println(buffer.get()); 

如果你運行完上面的代碼你會發(fā)現(xiàn),打印出來的結(jié)果是 0 ,并不是我們期望的 s 的 ASCII 碼 115。

首先告訴大家結(jié)論,這是符合預(yù)期的,這個時候就不應(yīng)該能獲取到值。我們來看看 get 的源碼:

  1. public byte get() { return hb[ix(nextGetIndex())]; } 
  2.  
  3. protected int ix(int i) { return i + offset; } 
  4.  
  5. final int nextGetIndex() {                           
  6.   int p = position; 
  7.   if (p >= limit) 
  8.     throw new BufferUnderflowException(); 
  9.   // 這里 position 會往后移動一位 
  10.   position = p + 1; 
  11.   return p; 

當(dāng)前 position 是 2,而 limit 是 16,所以最終 nextGetIndex 計算出來的值就是變量 p 的值 2 ,再過一次 ix ,那就是 2 + 0 = 2,這里的 offset 的值默認(rèn)為 0 。

所以簡單來說,最終會取到下標(biāo)為 2 的數(shù)據(jù),也就是下圖這樣。

所以我們當(dāng)然獲取不到數(shù)據(jù)。但是這里需要關(guān)注的是,調(diào)用 get 方法雖然沒有獲取到任何數(shù)據(jù),但是會使得 position 指針往后移動。換句話說,會占用一個位置。如果連續(xù)調(diào)用幾次這種 get 之后,再調(diào)用 put 方法寫入數(shù)據(jù),就會造成有幾個位置沒有賦值。舉個例子,假設(shè)我們運行以下代碼:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s','h'}); 
  4.  
  5.   buffer.get(); 
  6.   buffer.get(); 
  7.   buffer.get(); 
  8.   buffer.get(); 
  9.  
  10.   buffer.put(new byte[]{'e'}); 

數(shù)據(jù)就會變成下圖這樣,position 會往后移動

那你可能會問,那我真的需要獲取數(shù)據(jù)咋辦?在這種情況下,可以像這樣獲取:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s'}); 
  4.   System.out.println(buffer.get(0)); // 115 

傳入我們想要獲取的下標(biāo),就可以直接獲取到,并且不會造成 position 的后移。

看到這那你更懵逼了,合著 get() 就沒法用唄?還必須要給個 index。這就需要聊一下另一個方法 flip了。

flip

廢話不多說,先看看例子:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s''h'}); // java.nio.HeapByteBuffer[pos=2 lim=16 cap=16] 
  4.   buffer.flip(); 
  5.   System.out.println(buffer); // java.nio.HeapByteBuffer[pos=0 lim=2 cap=16] 

有意思的事情發(fā)生了,調(diào)用了 flip 之后,position 從 2 變成了 0,limit 從 16 變成了 2。

這個單詞是「翻動」的意思,我個人的理解是像翻東西一樣把之前存的東西全部翻一遍

你會發(fā)現(xiàn),position 變成了 0,而 limit 變成 2,這個范圍剛好是有值的區(qū)間。

接下來就更有意思了:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s''h'}); 
  4.   buffer.flip(); 
  5.   System.out.println((char)buffer.get()); // s 
  6.   System.out.println((char)buffer.get()); // h 

調(diào)用了 flip 之后,之前沒法用的 get() 居然能用了。結(jié)合 get 中給的源碼不難分析出來,由于 position 變成了 0,最終計算出來的結(jié)果就是 0,同時使 position 向后移動一位。

終于到這了,你可以理解成 Buffer 有兩種狀態(tài),分別是:

  • 讀模式
  • 寫模式

剛剛創(chuàng)建出來的 ByteBuffer 就處于一個寫模式的狀態(tài),通過調(diào)用 flip 我們可以將 ByteBuffer 切換成讀模式。但需要注意,這里講的讀、寫模式只是一個邏輯上的概念。

舉個例子,當(dāng)調(diào)用 flip 切換到所謂的寫模式之后,依然能夠調(diào)用 put 方法向 ByteBuffer 中寫入數(shù)據(jù)。

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s''h'}); 
  4.   buffer.flip(); 
  5.   buffer.put(new byte[]{'e'}); 

這里的 put 操作依然能成功,但你會發(fā)現(xiàn)最后寫入的 e 覆蓋了之前的數(shù)據(jù),現(xiàn)在 ByteBuffer 的值變成了 eh 而不是 sh 了。

flip_put

所以你現(xiàn)在應(yīng)該能夠明白,讀模式、寫模式更多的含義應(yīng)該是:

  • 方便你讀的模式
  • 方便你寫的模式

順帶一提,調(diào)用 flip 進(jìn)入寫讀模式之后,后續(xù)如果調(diào)用 get() 導(dǎo)致 position 大于等于了 limit 的值,程序會拋出 BufferUnderflowException 異常。這點從之前 get 的源碼也可以看出來。

rewind

rewind 你也可以理解成是運行在讀模式下的命令,給大家看個例子:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'s''h'}); 
  4.   buffer.flip(); 
  5.   System.out.println((char)buffer.get()); // s 
  6.   System.out.println((char)buffer.get()); // h 
  7.  
  8.   // 從頭開始讀 
  9.   buffer.rewind(); 
  10.  
  11.   System.out.println((char)buffer.get()); // s 
  12.   System.out.println((char)buffer.get()); // h 

所謂的從頭開始讀就是把 position 給歸位到下標(biāo)為 0 的位置,其源碼也很簡單:

  1. public final Buffer rewind() { 
  2.   position = 0; 
  3.   mark = -1; 
  4.   return this; 

rewind

就是簡單的把 position 賦值為 0,把 mark 賦值為 -1。那這個 mark 又是啥東西?這就是我們下一個要聊的方法。

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'a''b''c''d'}); 
  4.    
  5.   // 切換到讀模式 
  6.   buffer.flip(); 
  7.   System.out.println((char) buffer.get()); // a 
  8.   System.out.println((char) buffer.get()); // b 
  9.  
  10.   // 控記住當(dāng)前的 position 
  11.   buffer.mark(); 
  12.    
  13.   System.out.println((char) buffer.get()); // c 
  14.   System.out.println((char) buffer.get()); // d 
  15.  
  16.   // 將 position reset 到 mark 的位置 
  17.   buffer.reset(); 
  18.   System.out.println((char) buffer.get()); // c 
  19.   System.out.println((char) buffer.get()); // d 

可以看到的是 ,我們在 position 等于 2 的時候,調(diào)用了 mark 記住了 position 的位置。然后遍歷完了所有的數(shù)據(jù)。然后調(diào)用 reset 使得 position 回到了 2 的位置,我們繼續(xù)調(diào)用 get ,c d 就又可以被打印出來了。

clear

clear 表面意思看起來是將 buffer 清空的意思,但其實不是,看這個:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'a''b''c''d'}); 

put 完之后,buffer 的情況是這樣的。

當(dāng)我們調(diào)用完 clear 之后,buffer 就會變成這樣。

所以,你可以理解為,調(diào)用 clear 之后只是切換到了寫模式,因為這個時候往里面寫數(shù)據(jù),會覆蓋之前寫的數(shù)據(jù),相當(dāng)于起到了 clear 作用,再舉個例子:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put(new byte[]{'a''b''c''d'}); 
  4.   buffer.clear(); 
  5.   buffer.put(new byte[]{'s','h'}); 

可以看到,運行完之后 buffer 的數(shù)據(jù)變成了 shcd,后寫入的數(shù)據(jù)將之前的數(shù)據(jù)給覆蓋掉了。

除了 clear 可以切換到寫模式之外,還有另一個方法可以切換,這就是本篇要講的最后一個方法 compact。

compact

先一句話給出 compact 的作用:將還沒有讀完的數(shù)據(jù)挪到 Buffer 的首部,并切換到寫模式,代碼如下:

  1. public static void main(String[] args) { 
  2.   ByteBuffer buffer = ByteBuffer.allocate(16); 
  3.   buffer.put("abcd".getBytes(StandardCharsets.UTF_8)); 
  4.  
  5.   // 切換到讀模式 
  6.   buffer.flip(); 
  7.   System.out.println((char) buffer.get()); // a 
  8.  
  9.   // 將沒讀過的數(shù)據(jù), 移到 buffer 的首部 
  10.   buffer.compact(); // 此時 buffer 的數(shù)據(jù)就會變成 bcdd 

當(dāng)運行完 flip 之后,buffer 的狀態(tài)應(yīng)該沒什么問題了:

運行完 flip 之后

而 compact 之后發(fā)生了什么呢?簡單來說就兩件事:

  • 將 position 移動至對應(yīng)的位置
  • 將沒有讀過的數(shù)據(jù)移動到 buffer 的首部

這個對應(yīng)是啥呢?先給大家舉例子;例如沒有讀的數(shù)據(jù)是 bcd,那么 position 就為 3;如果沒有讀的數(shù)據(jù)為 cd,position 就為 2。所以你發(fā)現(xiàn)了,position 的值為沒有讀過的數(shù)據(jù)的長度。

從 buffer 內(nèi)部實現(xiàn)機制來看,凡是在 position - limit 這個區(qū)間內(nèi)的,都算沒有讀過的數(shù)據(jù)

所以,當(dāng)運行完 compact 之后,buffer 長這樣:

運行完 compact 之后

limit 為 16 是因為 compact 使 buffer 進(jìn)入了所謂的寫模式。

EOF

還有一些其他的方法就不在這里列舉了,大家感興趣可以自己去玩玩,都沒什么理解上的難度了。之后可能會再專門寫一寫 Channel 和 Selector,畢竟 Java 的 nio 三劍客,感興趣的可以關(guān)注一下。

 

責(zé)任編輯:武曉燕 來源: SH的全棧筆記
相關(guān)推薦

2022-03-31 18:59:43

數(shù)據(jù)庫InnoDBMySQL

2022-03-08 17:52:58

TCP格式IP

2021-08-27 07:06:10

IOJava抽象

2021-11-26 07:00:05

反轉(zhuǎn)整數(shù)數(shù)字

2021-07-15 07:23:28

Singlefligh設(shè)計

2022-02-14 10:16:22

Axios接口HTTP

2022-06-26 09:40:55

Django框架服務(wù)

2016-09-06 10:39:30

Dell Techno

2022-02-14 07:03:31

網(wǎng)站安全MFA

2023-08-14 08:38:26

反射reflect結(jié)構(gòu)體

2022-01-17 06:59:40

Grep指令linux

2023-08-02 08:35:54

文件操作數(shù)據(jù)源

2022-07-10 23:15:46

Go語言內(nèi)存

2022-08-01 07:57:03

數(shù)組操作內(nèi)存

2021-12-16 12:01:21

區(qū)塊鏈Libra貨幣

2021-07-31 11:40:55

Openresty開源

2012-04-14 20:47:45

Android

2022-09-26 14:25:55

Flowable流程ID

2014-02-25 08:59:14

2021-11-09 23:54:19

開發(fā)SMI Linkerd
點贊
收藏

51CTO技術(shù)棧公眾號

中文字幕亚洲欧美日韩2019| 国产精品羞羞答答xxdd| 国产丝袜一区二区| 国产区二区三区| 国产欧美精品国产国产专区 | 三级小说欧洲区亚洲区| 欧美日韩中文字幕日韩欧美| 日韩激情视频| 朝桐光av在线一区二区三区| 羞羞答答国产精品www一本| 精品国产一区二区三区久久狼5月| 国产乱国产乱老熟300部视频| 一区二区乱码| 尤物视频一区二区| 日韩三级电影网站| 人妻偷人精品一区二区三区| 美国三级日本三级久久99 | 性感美女一区二区在线观看| 亚洲色欲色欲www在线观看| 久热国产精品视频一区二区三区| 国产精品区在线观看| 久久福利毛片| 久久久免费精品| 男人操女人的视频网站| 国产一区二区三区四区大秀| 伊人成综合网伊人222| 亚洲综合一区二区三区| 日韩动漫在线观看| 五月婷婷开心中文字幕| 国产精品白丝jk白祙喷水网站| 国产不卡av在线| 精品国产乱码一区二区| 欧美久久综合| 免费91在线视频| 国产又粗又长又硬| 国产一区二区三区四区五区传媒| 亚洲第一精品夜夜躁人人爽| 日本r级电影在线观看| 国产精品久久久久久久久免费高清 | av毛片在线| 国产精品每日更新| 日韩欧美一区二区在线观看| 国产在线黄色| 久久精品人人做人人爽97| 狠狠色综合色区| 欧美 日韩 国产 精品| 国产精品夜夜爽| 亚洲字幕一区二区| 午夜精品久久久久久久99热黄桃 | 成人动漫网站在线观看| 亚洲精品中文字幕乱码三区91| 亚洲精品综合| 97视频免费在线看| 天海翼一区二区| 亚洲精品资源| 日韩美女av在线免费观看| av黄色在线播放| 美女被久久久| 国产精品久久久久久久久久三级| 黄色一级视频免费看| 免费亚洲视频| 国产精品精品久久久久久| 国产在线观看第一页| 日韩电影在线观看网站| 国产精品久久久久秋霞鲁丝 | 国产亚洲成aⅴ人片在线观看| 国语精品中文字幕| 青青久在线视频免费观看| 97aⅴ精品视频一二三区| 久热这里只精品99re8久| 蜜桃成人在线视频| 国产精品欧美一级免费| 一区二区三区四区久久| 青春草视频在线观看| 亚洲一区二区在线观看视频| 3d动漫一区二区三区| 成人影院av| 欧美日韩国产中文| 亚洲成人激情小说| 欧美激情极品| 在线成人激情视频| 日韩一级片大全| 在线国产日韩| 国产精品永久免费视频| 国产av精国产传媒| 91麻豆免费观看| 中文字幕超清在线免费观看| 亚洲小说区图片| 欧美日韩亚洲一区二区三区| mm131国产精品| jazzjazz国产精品麻豆| 亚洲丝袜在线视频| 曰本女人与公拘交酡| 日韩亚洲国产欧美| 国产欧美一区二区三区久久| 成人黄色在线观看视频| 久久久国产午夜精品| 91嫩草国产丨精品入口麻豆| 91九色porn在线资源| 欧美私模裸体表演在线观看| 欧美午夜精品一区二区| 青青草综合网| 97久久国产精品| 91极品身材尤物theporn| 成人99免费视频| 亚洲一区精品视频| 日本免费一区二区六区| 制服丝袜一区二区三区| 永久免费看mv网站入口78| 中文字幕福利视频| 日韩中文字幕区一区有砖一区 | 在线一级成人| 色综合久久88色综合天天看泰| 综合网在线观看| 国产999精品久久久久久绿帽| 色视频一区二区三区| 123区在线| 欧美一区永久视频免费观看| 亚洲av无码一区二区三区人| 欧美日韩国产高清| 成人亚洲综合色就1024| 东热在线免费视频| 精品久久久久久久久久久久久| 波多野结衣免费观看| 欧美日韩在线网站| 日本三级韩国三级久久| 亚洲精品一区二区三区区别| 国产精品电影一区二区| 国产精品无码一本二本三本色| 国内自拍欧美| 欧美激情极品视频| 国产喷水福利在线视频| 国产精品私人自拍| 99热成人精品热久久66| 老牛精品亚洲成av人片| 久久久久久午夜| 亚洲国产www| 亚洲精品国产无套在线观| wwwwwxxxx日本| 青青草原综合久久大伊人精品| 国产成一区二区| 国自产拍在线网站网址视频| 激情成人中文字幕| 中文乱码人妻一区二区三区视频| 在线观看视频免费一区二区三区| 成人午夜电影免费在线观看| 97caopor国产在线视频| 欧美一区二区久久久| 国产在视频线精品视频| 小草在线视频免费播放| 欧美成人激情免费网| 日本一级片免费| 精品一区二区三区不卡 | 爱久久·www| 91久久国产综合久久| 国产又粗又猛又爽又黄av| 久久激情综合| 色涩成人影视在线播放| 免费一级欧美在线观看视频| 日韩一区视频在线| 国产chinasex对白videos麻豆| 亚洲视频1区2区| 亚洲麻豆一区二区三区| 日韩视频精品在线观看| 久久久久久草| 日韩av电影资源网| 久久久国产精品x99av| 精品国产av 无码一区二区三区| 亚洲欧美国产毛片在线| 中文字幕在线播放一区二区| 今天的高清视频免费播放成人| 国外成人在线视频网站| 老司机2019福利精品视频导航| 国产一区二区动漫| 免费黄视频在线观看| 超碰最新在线| 日韩欧美国产精品| 日韩精品人妻中文字幕| 91丨porny丨最新| 国内自拍视频网| 51精产品一区一区三区| 国产精品一 二 三| 中文在线资源| 日韩在线免费高清视频| 亚洲欧美黄色片| 999在线观看精品免费不卡网站| 色偷偷www8888| 天天操综合网| 国产精品久久精品国产| 综合在线影院| 久久成人av网站| 亚洲av成人无码久久精品老人 | 视频一区二区视频| 久久综合社区| 国产美女精品视频免费观看| 欧美黑人xx片| 成人黄色免费网站在线观看| 亚洲欧美另类综合| 在线亚洲+欧美+日本专区| 日韩福利小视频| 91麻豆免费看| 熟妇女人妻丰满少妇中文字幕| 久久久久在线| 91精品国产毛片武则天| 久久99免费视频| 91久久国产综合久久蜜月精品| 英国三级经典在线观看| 久久国产精品久久久久久| 青青操视频在线| 日韩欧美国产小视频| 国产精品午夜一区二区| 亚洲成a天堂v人片| 国产日韩欧美另类| 久cao在线| 国产一区二区黄| 日本xxxxwww| 国产日韩欧美在线观看视频| 日本a级不卡| 成人免费看片网址| 国产美女久久| 蜜月aⅴ免费一区二区三区| 黄网在线免费| 精品第一国产综合精品aⅴ| 伊人亚洲综合网| 日韩欧美在线视频免费观看| 久久久久久久久久99| 国产精品久久午夜夜伦鲁鲁| 男男做爰猛烈叫床爽爽小说| 国产一区二区久久| 免费看涩涩视频| 日本网站在线观看一区二区三区| 蜜桃传媒一区二区三区| 欧美1区视频| 一区二区三区免费网站| 中日韩精品一区二区三区| 国产精品18久久久| 91热视频在线观看| jizz视频在线观看| 精品日韩在线观看| 国产成人精品毛片| 欧美一级生活片| 国产麻豆一精品一男同| 欧美日韩的一区二区| 中文字幕永久在线观看| 91国内精品野花午夜精品| 欧美 日韩 精品| 精品女同一区二区三区在线播放 | 偷窥自拍亚洲色图精选| 国产精品乱子乱xxxx| 一区二区三区四区精品视频| 5566av亚洲| 日韩视频一二区| 成人综合色站| 国产香蕉精品| 久久久久se| 神马影视一区二区| 日韩中文字幕av在线| blacked蜜桃精品一区| 亚洲第一导航| 久久久久久久久久久9不雅视频| 一区二区欧美日韩| 亚洲欧美偷拍视频| 最新不卡av在线| 欧美卡一卡二卡三| 一区二区不卡在线播放| 日韩欧美a级片| 色综合色狠狠天天综合色| 草莓视频18免费观看| 欧美亚洲综合网| 国产乱淫片视频| 精品欧美久久久| 久久久久久青草| 最近免费中文字幕视频2019| caopo在线| 51久久精品夜色国产麻豆| 日韩免费小视频| 成人激情视频网| 一区二区三区四区高清视频| 久久国产手机看片| 日韩午夜电影网| 国产爆乳无码一区二区麻豆| 国产视频一区欧美| 欧美成人福利在线观看| 国产99精品国产| 亚洲а∨天堂久久精品2021| 亚洲欧洲av一区二区三区久久| www.99re7.com| 欧美视频在线一区二区三区 | 中文字幕亚洲欧美日韩高清| 成人免费视屏| 日本免费久久高清视频| 欧美黄色一级| 日本一区免费| 精品999成人| jizz大全欧美jizzcom| 成人h动漫精品一区二| 手机av在线不卡| 欧美日韩国产综合视频在线观看中文 | 91精品国产调教在线观看| 国产黄页在线观看| 国产免费av国片精品草莓男男 | av成人 com a| 国产精自产拍久久久久久蜜| 国产精品x8x8一区二区| 亚洲一卡二卡区| 男人天堂欧美日韩| 亚洲成a人无码| 最好看的中文字幕久久| 精产国品一区二区| 亚洲国产精品va| 9191在线播放| 国产日韩欧美电影在线观看| 亚洲欧美tv| 97超碰在线人人| 韩国一区二区三区| 微拍福利一区二区| 欧美日韩国产中字| 免费a视频在线观看| 久久国产精品亚洲| 久久亚洲国产精品尤物| 欧美专区一二三| 999在线观看精品免费不卡网站| 99久久综合网| 亚洲视频狠狠干| 97超碰国产在线| 一区二区三区日韩在线| 欧美大电影免费观看| 国产自产精品| 亚洲性视频h| 国产精品偷伦视频免费观看了| 国产精品久久久久一区二区三区| 激情视频网站在线观看| 亚洲国产精品资源| 9999在线视频| 国产视频在线观看一区| 国产精品啊v在线| 亚洲性图第一页| 一区二区在线观看免费视频播放| 国产精品久久久久久在线| 日韩最新av在线| 精品三级在线| 一区二区免费电影| 黄色资源网久久资源365| 老熟妇高潮一区二区三区| 欧美精品自拍偷拍动漫精品| 四虎久久免费| 91久久精品国产91性色| 亚洲国产成人精品女人| 成年人网站av| 亚洲一区中文日韩| 免费激情视频网站| **欧美日韩vr在线| 免费av一区| 亚洲污视频在线观看| 国产精品美女一区二区在线观看| 一级片aaaa| 欧美日韩第一视频| 女人抽搐喷水高潮国产精品| 国产精品免费入口| 国产三级欧美三级| 96日本xxxxxⅹxxx17| 欧美黑人一区二区三区| 丁香五月缴情综合网| 18岁网站在线观看| 国产欧美日韩另类一区| 欧美高清69hd| 久久国产精品亚洲| 欧美日韩导航| 国产欧美日韩视频| 黄a在线观看| 成人疯狂猛交xxx| 欧美午夜不卡| 国产麻豆剧传媒精品国产av| 欧美性猛交xxxx富婆弯腰| 国产一区二区三区不卡在线| 国产欧美亚洲精品| 欧美日本精品| 熟女少妇一区二区三区| 欧美日韩五月天| 欧美24videosex性欧美| 美国av一区二区三区| 老司机精品视频导航| 国产性生活网站| 亚洲视频在线视频| 永久免费精品视频| 成人在线观看a| 亚洲精品第1页| 暖暖视频在线免费观看| 成人在线小视频| 先锋影音久久久| 日韩成人毛片视频| 精品伊人久久97| 日本免费一区二区三区视频| 欧美色图色综合| 亚洲美女在线国产| 男女污视频在线观看| 99精品国产高清一区二区| 天堂资源在线中文精品| 久久精品一区二区三| 一本色道久久综合亚洲精品小说|