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

Java壓縮20M文件從30秒到1秒的優化過程

開發 后端
有一個需求需要將前端傳過來的10張照片,然后后端進行處理以后壓縮成一個壓縮包通過網絡流傳輸出去。之前沒有接觸過用Java壓縮文件的,所以就直接上網找了一個例子改了一下用了,改完以后也能使用,但是隨著前端所傳圖片的大小越來越大的時候,耗費的時間也在急劇增加,最后測了一下壓縮20M...

有一個需求需要將前端傳過來的10張照片,然后后端進行處理以后壓縮成一個壓縮包通過網絡流傳輸出去。之前沒有接觸過用Java壓縮文件的,所以就直接上網找了一個例子改了一下用了,改完以后也能使用,但是隨著前端所傳圖片的大小越來越大的時候,耗費的時間也在急劇增加,最后測了一下壓縮20M的文件竟然需要30秒的時間。壓縮文件的代碼如下。 

  1. public static void zipFileNoBuffer() { 
  2.     File zipFile = new File(ZIP_FILE); 
  3.     try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) { 
  4.         //開始時間 
  5.         long beginTime = System.currentTimeMillis(); 
  6.  
  7.         for (int i = 0; i < 10; i++) { 
  8.             try (InputStream input = new FileInputStream(JPG_FILE)) { 
  9.                 zipOut.putNextEntry(new ZipEntry(FILE_NAME + i)); 
  10.                 int temp = 0; 
  11.                 while ((temp = input.read()) != -1) { 
  12.                     zipOut.write(temp); 
  13.                 } 
  14.             } 
  15.         } 
  16.         printInfo(beginTime); 
  17.     } catch (Exception e) { 
  18.         e.printStackTrace(); 
  19.     } 

這里找了一張2M大小的圖片,并且循環十次進行測試。打印的結果如下,時間大概是30秒。 

  1. fileSize:20M 
  2. consum time:29599 

第一次優化過程-從30秒到2秒

進行優化首先想到的是利用緩沖區 BufferInputStream。在 FileInputStream中 read()方法每次只讀取一個字節。源碼中也有說明。 

  1. /** 
  2.  * Reads a byte of data from this input stream. This method blocks 
  3.  * if no input is yet available. 
  4.  * 
  5.  * @return     the next byte of data, or <code>-1</code> if the end of the 
  6.  *             file is reached. 
  7.  * @exception  IOException  if an I/O error occurs. 
  8.  */ 
  9. public native int read() throws IOException; 

這是一個調用本地方法與原生操作系統進行交互,從磁盤中讀取數據。每讀取一個字節的數據就調用一次本地方法與操作系統交互,是非常耗時的。例如我們現在有30000個字節的數據,如果使用 FileInputStream那么就需要調用30000次的本地方法來獲取這些數據,而如果使用緩沖區的話(這里假設初始的緩沖區大小足夠放下30000字節的數據)那么只需要調用一次就行。因為緩沖區在第一次調用 read()方法的時候會直接從磁盤中將數據直接讀取到內存中。隨后再一個字節一個字節的慢慢返回。

BufferedInputStream內部封裝了一個byte數組用于存放數據,默認大小是8192

優化過后的代碼如下 

  1. public static void zipFileBuffer() { 
  2.     File zipFile = new File(ZIP_FILE); 
  3.     try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); 
  4.             BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(zipOut)) { 
  5.         //開始時間 
  6.         long beginTime = System.currentTimeMillis(); 
  7.         for (int i = 0; i < 10; i++) { 
  8.             try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(JPG_FILE))) { 
  9.                 zipOut.putNextEntry(new ZipEntry(FILE_NAME + i)); 
  10.                 int temp = 0; 
  11.                 while ((temp = bufferedInputStream.read()) != -1) { 
  12.                     bufferedOutputStream.write(temp); 
  13.                 } 
  14.             } 
  15.         } 
  16.         printInfo(beginTime); 
  17.     } catch (Exception e) { 
  18.         e.printStackTrace(); 
  19.     } 

輸出 

  1. ------Buffer 
  2. fileSize:20M 
  3. consum time:1808 

可以看到相比較于第一次使用 FileInputStream效率已經提升了許多了

第二次優化過程-從2秒到1秒

使用緩沖區 buffer的話已經是滿足了我的需求了,但是秉著學以致用的想法,就想著用NIO中知識進行優化一下。

使用Channel

為什么要用 Channel呢?因為在NIO中新出了 Channel和 ByteBuffer。正是因為它們的結構更加符合操作系統執行I/O的方式,所以其速度相比較于傳統IO而言速度有了顯著的提高。Channel就像一個包含著煤礦的礦藏,而 ByteBuffer則是派送到礦藏的卡車。也就是說我們與數據的交互都是與 ByteBuffer的交互。

在NIO中能夠產生 FileChannel的有三個類。分別是 FileInputStream、 FileOutputStream、以及既能讀又能寫的 RandomAccessFile。

源碼如下 

  1. public static void zipFileChannel() { 
  2.     //開始時間 
  3.     long beginTime = System.currentTimeMillis(); 
  4.     File zipFile = new File(ZIP_FILE); 
  5.     try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); 
  6.             WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) { 
  7.         for (int i = 0; i < 10; i++) { 
  8.             try (FileChannel fileChannel = new FileInputStream(JPG_FILE).getChannel()) { 
  9.                 zipOut.putNextEntry(new ZipEntry(i + SUFFIX_FILE)); 
  10.                 fileChannel.transferTo(0, FILE_SIZE, writableByteChannel); 
  11.             } 
  12.         } 
  13.         printInfo(beginTime); 
  14.     } catch (Exception e) { 
  15.         e.printStackTrace(); 
  16.     } 

我們可以看到這里并沒有使用 ByteBuffer進行數據傳輸,而是使用了 transferTo的方法。這個方法是將兩個通道進行直連。 

  1. This method is potentially much more efficient than a simple loop  
  2. * that reads from this channel and writes to the target channel. Many  
  3. * operating systems can transfer bytes directly from the filesystem cache  
  4. to the target channel without actually copying them.  

這是源碼上的描述文字,大概意思就是使用 transferTo的效率比循環一個 Channel讀取出來然后再循環寫入另一個 Channel好。操作系統能夠直接傳輸字節從文件系統緩存到目標的 Channel中,而不需要實際的 copy階段。

copy階段就是從內核空間轉到用戶空間的一個過程

可以看到速度相比較使用緩沖區已經有了一些的提高。 

  1. ------Channel 
  2. fileSize:20M 
  3. consum time:1416 

內核空間和用戶空間

那么為什么從內核空間轉向用戶空間這段過程會慢呢?首先我們需了解的是什么是內核空間和用戶空間。在常用的操作系統中為了保護系統中的核心資源,于是將系統設計為四個區域,越往里權限越大,所以Ring0被稱之為內核空間,用來訪問一些關鍵性的資源。Ring3被稱之為用戶空間。 

 

 

 

用戶態、內核態:線程處于內核空間稱之為內核態,線程處于用戶空間屬于用戶態

那么我們如果此時應用程序(應用程序是都屬于用戶態的)需要訪問核心資源怎么辦呢?那就需要調用內核中所暴露出的接口用以調用,稱之為系統調用。例如此時我們應用程序需要訪問磁盤上的文件。此時應用程序就會調用系統調用的接口 open方法,然后內核去訪問磁盤中的文件,將文件內容返回給應用程序。大致的流程如下 

 

 

 

直接緩沖區和非直接緩沖區

既然我們要讀取一個磁盤的文件,要廢這么大的周折。有沒有什么簡單的方法能夠使我們的應用直接操作磁盤文件,不需要內核進行中轉呢?有,那就是建立直接緩沖區了。

非直接緩沖區:非直接緩沖區就是我們上面所講內核態作為中間人,每次都需要內核在中間作為中轉。 

 

 

 

直接緩沖區:直接緩沖區不需要內核空間作為中轉copy數據,而是直接在物理內存申請一塊空間,這塊空間映射到內核地址空間和用戶地址空間,應用程序與磁盤之間數據的存取通過這塊直接申請的物理內存進行交互。 

 

 

 

既然直接緩沖區那么快,我們為什么不都用直接緩沖區呢?其實直接緩沖區有以下的缺點。直接緩沖區的缺點:

1、不安全

2、消耗更多,因為它不是在JVM中直接開辟空間。這部分內存的回收只能依賴于垃圾回收機制,垃圾什么時候回收不受我們控制。

3、數據寫入物理內存緩沖區中,程序就喪失了對這些數據的管理,即什么時候這些數據被最終寫入從磁盤只能由操作系統來決定,應用程序無法再干涉。

綜上所述,所以我們使用 transferTo方法就是直接開辟了一段直接緩沖區。所以性能相比而言提高了許多

使用內存映射文件

NIO中新出的另一個特性就是內存映射文件,內存映射文件為什么速度快呢?其實原因和上面所講的一樣,也是在內存中開辟了一段直接緩沖區。與數據直接作交互。源碼如下 

  1. //Version 4 使用Map映射文件 
  2. public static void zipFileMap() { 
  3.     //開始時間 
  4.     long beginTime = System.currentTimeMillis(); 
  5.     File zipFile = new File(ZIP_FILE); 
  6.     try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); 
  7.             WritableByteChannel writableByteChannel = Channels.newChannel(zipOut)) { 
  8.         for (int i = 0; i < 10; i++) { 
  9.  
  10.             zipOut.putNextEntry(new ZipEntry(i + SUFFIX_FILE)); 
  11.  
  12.             //內存中的映射文件 
  13.             MappedByteBuffer mappedByteBuffer = new RandomAccessFile(JPG_FILE_PATH, "r").getChannel() 
  14.                     .map(FileChannel.MapMode.READ_ONLY, 0, FILE_SIZE); 
  15.  
  16.             writableByteChannel.write(mappedByteBuffer); 
  17.         } 
  18.         printInfo(beginTime); 
  19.     } catch (Exception e) { 
  20.         e.printStackTrace(); 
  21.     } 

打印如下 

  1. ---------Map 
  2. fileSize:20M 
  3. consum time:1305 

可以看到速度和使用Channel的速度差不多的。

使用Pipe

Java NIO 管道是2個線程之間的單向數據連接。Pipe有一個source通道和一個sink通道。其中source通道用于讀取數據,sink通道用于寫入數據。可以看到源碼中的介紹,大概意思就是寫入線程會阻塞至有讀線程從通道中讀取數據。如果沒有數據可讀,讀線程也會阻塞至寫線程寫入數據。直至通道關閉。 

  1. Whether or not a thread writing bytes to a pipe will block until another 
  2. thread reads those bytes  

 

 

 

我想要的效果是這樣的。源碼如下 

  1. //Version 5 使用Pip 
  2. public static void zipFilePip() { 
  3.  
  4.     long beginTime = System.currentTimeMillis(); 
  5.     try(WritableByteChannel out = Channels.newChannel(new FileOutputStream(ZIP_FILE))) { 
  6.         Pipe pipe = Pipe.open(); 
  7.         //異步任務 
  8.         CompletableFuture.runAsync(()->runTask(pipe)); 
  9.  
  10.         //獲取讀通道 
  11.         ReadableByteChannel readableByteChannel = pipe.source(); 
  12.         ByteBuffer buffer = ByteBuffer.allocate(((int) FILE_SIZE)*10); 
  13.         while (readableByteChannel.read(buffer)>= 0) { 
  14.             buffer.flip(); 
  15.             out.write(buffer); 
  16.             buffer.clear(); 
  17.         } 
  18.     }catch (Exception e){ 
  19.         e.printStackTrace(); 
  20.     } 
  21.     printInfo(beginTime); 
  22.  
  23.  
  24. //異步任務 
  25. public static void runTask(Pipe pipe) { 
  26.  
  27.     try(ZipOutputStream zos = new ZipOutputStream(Channels.newOutputStream(pipe.sink())); 
  28.             WritableByteChannel out = Channels.newChannel(zos)) { 
  29.         System.out.println("Begin"); 
  30.         for (int i = 0; i < 10; i++) { 
  31.             zos.putNextEntry(new ZipEntry(i+SUFFIX_FILE)); 
  32.  
  33.             FileChannel jpgChannel = new FileInputStream(new File(JPG_FILE_PATH)).getChannel(); 
  34.  
  35.             jpgChannel.transferTo(0, FILE_SIZE, out); 
  36.  
  37.             jpgChannel.close(); 
  38.         } 
  39.     }catch (Exception e){ 
  40.         e.printStackTrace(); 
  41.     } 

總結

生活處處都需要學習,有時候只是一個簡單的優化,可以讓你深入學習到各種不同的知識。所以在學習中要不求甚解,不僅要知道這個知識也要了解為什么要這么做。

知行合一:學習完一個知識要盡量應用一遍。這樣才能記得牢靠。

源碼地址

https://github.com/modouxiansheng/Doraemon 

 

責任編輯:龐桂玉 來源: 不學無數的程序員
相關推薦

2019-08-21 14:35:18

壓縮文件優化過程Java

2025-06-27 09:05:47

2017-12-25 11:15:06

JavaArray數組

2025-06-25 09:30:14

2022-09-26 09:41:25

MySQL數據庫

2021-08-26 22:26:55

性能優化技術

2025-08-18 03:00:22

Spring樹形結構分類樹

2019-01-30 09:34:56

ElasticSearLogstashKibana

2025-03-27 00:14:10

2013-11-11 11:17:45

AngularJS性能優化

2025-06-04 02:20:00

SQL優化儀表盤

2011-09-29 09:57:27

Ubuntu 11.1

2012-07-24 09:37:19

寬帶光纖

2010-08-19 09:36:28

飛輪儲能UPS飛輪UPS

2024-11-08 09:34:54

2024-05-06 10:11:51

2015-11-23 17:34:33

秒借

2024-11-01 12:10:57

2019-09-27 17:24:26

數據庫優化sql

2024-11-08 15:08:17

點贊
收藏

51CTO技術棧公眾號

亚洲视频专区在线| 成人动漫视频在线| 中文字幕精品在线| 久久久久无码精品| 手机在线观看av| 136国产福利精品导航| 成人h在线播放| 销魂美女一区二区| 欧美日韩精品| 中文字幕综合一区| 国产女主播在线播放| 成人做爰免费视频免费看| 亚洲精品综合在线| 日本午夜精品一区二区| 亚洲黄色一级大片| 免费成人你懂的| 国产综合在线视频| 暗呦丨小u女国产精品| 五月国产精品| 精品福利一二区| www.精品在线| 亚洲天堂免费电影| 亚洲国产日韩av| a级黄色片网站| 国产视频精选在线| 免费视频成人| 黄色成人av网| 久久久久福利视频| 福利在线午夜| xfplay精品久久| 成人黄动漫网站免费| 91在线公开视频| 日韩av一区二区在线影视| 午夜精品久久久久久久99热浪潮| 久久国产高清视频| 日韩欧美一区免费| 影音先锋日韩有码| 在线免费观看黄色小视频| 9l视频自拍蝌蚪9l视频成人| 91麻豆精品国产自产在线观看一区 | 精品一区二区无码| 亚洲一区二区免费看| 欧美激情xxxxx| 中文字幕手机在线观看| 国产精品久久观看| 精品国产欧美成人夜夜嗨| 2019男人天堂| 日韩www.| 久久激情视频免费观看| 国产小视频你懂的| 亚洲mv大片欧洲mv大片| 久久精品国产96久久久香蕉| 成人黄色短视频| 色135综合网| 日韩一区二区三区在线播放| 亚洲AV成人无码网站天堂久久| 欧美色图国产精品| 日韩中文综合网| 青花影视在线观看免费高清| 91精品一区二区三区综合| 久久伊人精品天天| 久久在线视频精品| 亚洲第一伊人| 奇米一区二区三区四区久久| 国产成人精品777777| 青青青爽久久午夜综合久久午夜 | 亚洲免费黄色网址| 日韩在线一二三区| 国产综合久久久久| www夜片内射视频日韩精品成人| 国产99久久久国产精品免费看| 国产精品国色综合久久| 天堂资源中文在线| 国产欧美精品一区二区三区四区 | 国产精品日韩二区| 欧美扣逼视频| 中文字幕一区二区不卡| 精品无码av无码免费专区| av影视在线| 日本精品一区二区三区高清| 精品国产鲁一鲁一区二区三区| 伊人精品久久| 亚洲男人天堂古典| 91精品少妇一区二区三区蜜桃臀| 亚洲视屏一区| 国产精品av网站| 国产视频在线观看视频| www.久久久久久久久| 欧美资源一区| 在线观看中文| 在线欧美一区二区| 韩国三级hd中文字幕有哪些| 亚洲资源网你懂的| 美女av一区二区三区| 国产精品伦子伦| 女人丝袜激情亚洲| 欧美猛交免费看| 日韩免费av网站| 国产成人亚洲综合色影视| 国产精品情侣自拍| 精品久久人妻av中文字幕| 久久综合久久综合久久综合| 26uuu成人| 天堂av中文在线观看| 欧美一区二区视频观看视频| 在线免费观看日韩av| 亚洲国产成人精品女人| 日本国产精品视频| 亚洲AV无码乱码国产精品牛牛| 久久久99精品免费观看| 国产日韩亚洲欧美在线| 福利精品一区| 日韩精品中文字幕在线播放| 国产人妻精品一区二区三区不卡| 久久青草久久| 国产一区二区中文字幕免费看| 调教视频免费在线观看| 色综合亚洲欧洲| 超碰caoprom| 欧美精品观看| 成人免费黄色网| 日本福利午夜视频在线| 亚洲午夜视频在线| 在线免费黄色网| 日韩精品一区二区三区免费观看| 欧美在线性爱视频| 日韩中文字幕免费观看| 亚洲精品伦理在线| www.久久久久久久久久久| 欧美综合视频| 国产精品福利久久久| 日本亚洲欧美| 精品国产鲁一鲁一区二区张丽| 国产精品成人免费一区久久羞羞| 91精品啪在线观看国产81旧版| 国产在线拍偷自揄拍精品| eeuss影院www在线观看| 欧美在线免费观看亚洲| av女人的天堂| 三级精品在线观看| 日韩啊v在线| 欧美日韩亚洲国产| 一区二区av在线| 中文字幕在线观看视频一区| 国产精品女同互慰在线看| 一路向西2在线观看| 波多野结衣一区| 国产精品18久久久久久首页狼| 巨骚激情综合| 欧美视频一区二区三区四区| 91成人精品一区二区| 蜜桃传媒麻豆第一区在线观看| 五月天久久狠狠| 男人亚洲天堂| 欧美老肥婆性猛交视频| 午夜老司机福利| 午夜影院久久久| 成人网站免费观看| 日本中文字幕不卡| 综合国产精品久久久| 精品一区二区三区中文字幕| 久久久久久久久91| 亚洲欧美日韩免费| 在线观看一区不卡| 内射一区二区三区| 成人国产精品免费观看| 国产免费成人在线| 日韩综合一区| 国产一区二区精品在线| 美脚恋feet久草欧美| 影音先锋日韩有码| a级片免费观看| 激情成人在线视频| a资源在线观看| 国产精品中文字幕日韩精品 | 在线观看涩涩| 中文字幕视频一区二区在线有码| 国产sm主人调教女m视频| 亚洲h精品动漫在线观看| 久久av无码精品人妻系列试探| 久久99国产精品麻豆| 成人精品视频在线播放| 精品国产99| av一区二区三区四区电影| 亚洲精品88| 九九热这里只有精品6| 日韩精品视频无播放器在线看| 欧美精品久久99久久在免费线| 偷偷色噜狠狠狠狠的777米奇| 美女久久网站| 9191国产视频| av亚洲在线观看| 国产 高清 精品 在线 a| 日韩高清中文字幕一区二区| 久久91亚洲精品中文字幕| 国产黄色在线| 欧美mv和日韩mv的网站| 欧美成人精品网站| 亚洲韩国一区二区三区| 91动漫免费网站| 96av麻豆蜜桃一区二区| 波多野结衣免费观看| 久久久久国产精品一区三寸 | 三级在线观看一区二区| 欧美黄网在线观看| 91精品综合久久久久久久久久久| 久草一区二区| 在线一区二区三区视频| 国产精品三级美女白浆呻吟| 中文字幕在线看片| 久久99青青精品免费观看| 91露出在线| 亚洲欧洲高清在线| 无码国精品一区二区免费蜜桃| 777欧美精品| 中文字幕在线观看国产| 日本乱码高清不卡字幕| 日韩在线视频免费播放| 亚洲一区在线观看免费观看电影高清| 九九热久久免费视频| 久久综合久色欧美综合狠狠| 第四色在线视频| 国产成人精品免费网站| 欧美成人乱码一二三四区免费| 石原莉奈一区二区三区在线观看| 国产午夜伦鲁鲁| 亚洲成人资源| 精品一二三四五区| 欧美色图麻豆| 亚洲精品天堂成人片av在线播放| 亚洲电影在线一区二区三区| 天堂v在线视频| 国产精品99在线观看| 视频在线一区二区三区| 欧美一级精品| 一本色道久久99精品综合| 精品大片一区二区| 日韩欧美第二区在线观看| 国产精品免费99久久久| 日韩伦理一区二区三区av在线| 精品国产一区探花在线观看| 欧美色图亚洲自拍| 国产精品一国产精品| 欧美亚洲另类在线一区二区三区| 久久99青青| 视频一区二区综合| 日韩国产在线| 成人短视频在线看| 自拍偷拍欧美专区| 日本香蕉视频在线观看| 欧美激情第8页| 国产精品入口芒果| 国产精品亚洲欧美| 久久久久久久久久久久久久国产| 日韩国产精品久久久久久亚洲| 波多野结衣天堂| 精一区二区三区| 欧美熟妇另类久久久久久多毛| 风间由美性色一区二区三区| a级一a一级在线观看| 久久精品在线免费观看| 欧美一区二区三区观看| 精品人妻一区二区免费| bt在线麻豆视频| 日韩在线免费视频观看| 亚洲麻豆精品| 欧美男插女视频| 波多野结衣中文字幕久久| 午夜精品在线视频| 唐人社导航福利精品| 国产精品免费小视频| 国产精品一区二区美女视频免费看 | 天天色影综合网| 亚洲国产精品自拍| 无码人妻一区二区三区免费 | 十八禁一区二区三区| 亚洲欧美中文在线视频| 激情在线小视频| 亚州国产精品久久久| 超碰这里只有精品| 国产精品久久亚洲7777| 国产日产一区| 97在线免费视频观看| 另类国产ts人妖高潮视频| 亚洲天堂av一区二区| 不卡一区二区三区四区| 99久久99久久精品免费| 亚洲国产精品影院| 亚洲天堂视频网| 亚洲黄色免费三级| 精品国产99久久久久久| 98精品在线视频| 91麻豆精品国产综合久久久| 久久婷婷国产综合尤物精品| 久久久久免费av| 欧美三级午夜理伦三级| 国产精品一级黄| 91精品久久久久久久久久久久| 亚洲综合另类小说| 亚洲一级av毛片| 亚洲精品中文字幕av| 在线heyzo| 国产日韩欧美视频| 蜜桃a∨噜噜一区二区三区| 国产美女作爱全过程免费视频| 日韩av一二三| 亚洲最大的黄色网| 亚洲精品ww久久久久久p站| 这里只有精品6| 亚洲女人天堂成人av在线| 久久不射影院| 亚洲在线观看视频网站| 成人午夜av| 女性隐私黄www网站视频| 波多野结衣中文一区| 九九热视频精品| 6080亚洲精品一区二区| www.黄在线观看| 国产成人精品a视频一区www| 精品久久对白| 国产一二三在线视频| 国产成人精品综合在线观看| www.av成人| 欧美精品v国产精品v日韩精品 | 91福利视频网| 成人直播在线观看| 97超碰国产精品| 国产福利一区二区| 精品无码久久久久成人漫画| 欧美一区二区福利在线| 中文字幕av影院| 亚洲国产成人在线视频| 成人高清免费在线| 国产欧美最新羞羞视频在线观看| 国产成人久久| 午夜视频在线瓜伦| 成人啪啪18免费游戏链接| 亚洲国产美女| 久久久久中文字幕亚洲精品| 椎名由奈av一区二区三区| 中文字幕有码视频| 色婷婷综合久久久久| 韩国理伦片久久电影网| 亚洲一区二区精品在线| 久久精品国产一区二区三 | 国产成人无码精品| 欧美精品一区二区在线播放| 国产嫩草在线视频| 国产精品xxxx| 国产农村妇女精品一二区| a毛片毛片av永久免费| 欧美中文字幕亚洲一区二区va在线| www.在线视频.com| 成人黄色午夜影院| 欧美三区美女| 午夜久久久久久久| 色欧美日韩亚洲| 日本免费在线观看| 99久久精品免费看国产一区二区三区 | 欧美亚洲色图视频| 99精品一区二区| 无码任你躁久久久久久久| 日韩在线视频免费观看| 国产在线不卡一区二区三区| 久久精品无码中文字幕| 99精品欧美一区| 中文文字幕一区二区三三| 欧美成人免费大片| 国产人妖ts一区二区| 欧美女人性生活视频| 中文字幕电影一区| 亚洲AV无码乱码国产精品牛牛| 欧美中文字幕在线| 四季av一区二区凹凸精品| 亚洲熟妇一区二区| 日韩欧美亚洲范冰冰与中字| 日本成人网址| 精品不卡一区二区三区| 久久电影国产免费久久电影 | 成人无遮挡免费网站视频在线观看| 国产精品嫩草在线观看| 日本视频一区二区| 久久精品免费av| 亚洲视频视频在线| 欧美日韩中出| 成年人视频在线免费| 亚洲女人小视频在线观看| 天堂av中文在线资源库| 成人激情在线观看| 久久久久99| 香蕉视频一区二区| 中文字幕亚洲自拍| 色婷婷精品视频| 亚洲一区二区三区四区精品| 欧美视频中文在线看| 少女频道在线观看高清| 中文久久乱码一区二区| 免费看黄网站在线观看| 国产精品免费一区| 欧美专区18|