精品欧美一区二区三区在线观看 _久久久久国色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电影免费在线观看| 国产亚洲自拍av| 亚洲三级精品| 91精品在线一区二区| 国产精品久久国产| 日本免费一区二区三区最新| 亚洲一区欧美激情| 中文字幕视频一区二区在线有码 | 给我看免费高清在线观看| 天天免费亚洲黑人免费| 亚洲另类一区二区| 裸体丰满少妇做受久久99精品| 在线观看中文字幕码| 激情欧美日韩| www.亚洲男人天堂| 真人bbbbbbbbb毛片| 996久久国产精品线观看| 欧美日韩免费看| 无码人妻aⅴ一区二区三区日本| 五月激情婷婷综合| 精品制服美女丁香| 日本精品视频在线播放| 欧美日韩精品在线观看视频 | 伊人久久综合97精品| 亚洲AV成人精品| 高清亚洲高清| 欧美性色视频在线| 国产freexxxx性播放麻豆| 成人免费一区二区三区视频网站| 成人免费看黄yyy456| 国产一区欧美二区三区| 精品人妻一区二区三区潮喷在线 | 成人在线激情网| 韩国成人二区| 亚洲国产日韩a在线播放性色| 亚洲一区二区不卡视频| 国产在线资源| 99国产精品久久久久久久久久久| 亚洲一区国产精品| 亚洲精品一区二三区| 亚洲一区一卡| 91精品国产色综合| 国产香蕉在线视频| 国产精品扒开腿做爽爽爽软件| 久久久国产在线视频| 天天操天天舔天天射| 亚洲色图丝袜| 亚洲欧美日韩在线高清直播| 日b视频在线观看| 国产成人夜色高潮福利影视| 欧美一区二区三区在线看| 五月天开心婷婷| 91精品福利观看| 3d动漫精品啪啪| 免费人成视频在线播放| 精品国产不卡一区二区| 91精品国产综合久久久久久久| 一本色道久久亚洲综合精品蜜桃 | 欧美亚洲综合色| 久久久久久三级| 成人涩涩视频| 欧美三级日本三级少妇99| 成人在线观看a| 日韩三区免费| 欧美日韩一区二区在线观看| 中文字幕天天干| 日本一区二区三区中文字幕| 欧美猛男男办公室激情| 波多野结衣网页| 国产精东传媒成人av电影| 精品粉嫩aⅴ一区二区三区四区| 天堂www中文在线资源| 另类ts人妖一区二区三区| 亚洲精品av在线| 在线观看日本中文字幕| 欧美电影《轻佻寡妇》| 久久中国妇女中文字幕| 国产一卡二卡在线| 日韩高清在线一区| 91九色国产社区在线观看| 国产夫妻在线观看| 97久久超碰国产精品| 日韩av不卡播放| av黄在线观看| 欧美性生交xxxxxdddd| 天天插天天操天天射| 国产免费av国片精品草莓男男| 精品伦理精品一区| 91久久免费视频| 一区二区三区四区日韩| 97视频在线观看视频免费视频 | 中文字幕日韩av电影| 日韩三级久久久| 亚洲国产精品一区| 国产精品7m视频| www.久久精品.com| 久久久久久久久久久久久夜| 黄色www在线观看| 国产伦久视频在线观看| 欧美日韩精品一区二区三区| 亚洲一区二区三区黄色| 成人激情视频| 久久人人爽人人爽人人片av高请 | 希岛爱理一区二区三区av高清| 555www色欧美视频| 这里只有久久精品| 伊人久久亚洲美女图片| 国产免费一区二区三区在线能观看 | 成人做爰免费视频免费看| 亚洲精品一线二线三线无人区| 高清国产在线观看| 一本色道久久综合亚洲精品高清 | 亚洲自拍第二页| 97se亚洲国产综合自在线| 日本精品免费视频| 成人涩涩视频| 日韩高清有码在线| 豆国产97在线 | 亚洲| 另类欧美日韩国产在线| 欧美中日韩免费视频| а√在线天堂官网| 日韩欧美成人激情| 北条麻妃在线观看视频| 久久久久国产精品午夜一区| 99在线影院| 国产黄色美女视频| 中文在线一区二区| 国产黄页在线观看| 视频一区中文字幕精品| 中文字幕免费精品一区高清| 国产精品va无码一区二区三区| 国产精品77777| 亚洲高清视频在线观看| av男人的天堂在线观看| 欧美一二三四区在线| 欧美激情视频二区| 日本女优在线视频一区二区| 精品在线一区| 狂野欧美激情性xxxx欧美| 欧美精品一级二级| 秋霞网一区二区三区| 亚洲人成免费| 国产在线欧美日韩| 美女网站视频在线| 日韩一区二区三区高清免费看看| 久久久久无码精品国产sm果冻 | 欧美理论电影在线精品| 久久99精品久久久久久噜噜| 91丨porny丨在线中文| 国产欧美视频一区二区三区| 国产性xxxx18免费观看视频| 亚欧洲精品视频在线观看| 欧美高清视频在线观看| 国产精品视频a| 国产精品久久久久精k8| 午夜免费高清视频| 成人91在线| 国产精品99免视看9| 欧美一区二区三区成人片在线| 亚洲免费在线视频一区 二区| 911福利视频| 欧美mv日韩| 成人黄色av播放免费| 欧美一区二区三区| 欧美一区二区在线看| 久久久99999| 韩国v欧美v日本v亚洲v| 中日韩在线视频| 成人黄色理论片| 欧美精品少妇videofree| 亚洲国产精彩视频| 亚洲一区二区av电影| 婷婷五月精品中文字幕| 国产欧美日韩一级| 日韩成人av电影在线| 亚洲成av在线| 欧美日本黄视频| 免费av一级片| 在线精品视频小说1| 在线看片中文字幕| 精品影院一区二区久久久| 亚欧精品在线| 97一区二区国产好的精华液| 性欧美xxxx交| 国产精品视频二区三区| 欧美日本一区二区| 欧美日韩一级在线观看| 久久综合国产精品| xx欧美撒尿嘘撒尿xx| 婷婷综合网站| 国产精品污www一区二区三区| 少妇淫片在线影院| 国产亚洲一级高清| 亚洲AV无码精品国产| 日韩欧美高清在线视频| 亚洲女同二女同志奶水| 国产精品一区免费视频| 国产 日韩 亚洲 欧美| 最新国产精品视频| 国产裸体写真av一区二区| 手机在线免费观看av| 日韩精品在线免费| 国产精品一品二区三区的使用体验| 一区二区三区在线观看欧美| 亚洲中文字幕无码av| 黑人巨大精品欧美黑白配亚洲| 97超碰在线人人| 精品国产乱码久久久久久蜜坠欲下| 成人欧美在线观看| 亚洲精品永久免费视频| 久久久精品国产亚洲| 成av人电影在线观看| 精品少妇一区二区三区日产乱码 | 在线观看日韩| 蜜桃传媒视频第一区入口在线看| 亚洲毛片在线免费| 久久久亚洲成人| caoporn97在线视频| 亚洲乱码一区二区| 亚洲精品中文字幕成人片| 欧洲av一区二区嗯嗯嗯啊| 九九久久免费视频| 久久久久久久精| 无码人妻一区二区三区免费n鬼沢| 亚洲自拍另类| 国产精品自拍合集| 操欧美老女人| 高清国语自产拍免费一区二区三区| 国产日本久久| 日本a级片电影一区二区| 天堂8中文在线| 中文字幕精品一区二区精品| 四虎电影院在线观看| 亚洲第一av在线| 国产www视频| 欧美日韩一区二区在线视频| 亚洲精品午夜久久久久久久| 亚洲乱码日产精品bd| 高清国产在线观看| 久久久久免费观看| 国产麻豆xxxvideo实拍| 国产白丝精品91爽爽久久 | 国产ts人妖一区二区| 黄色永久免费网站| 日韩中文字幕麻豆| 99精品人妻少妇一区二区| 欧美天堂亚洲电影院在线观看| 成人在线免费高清视频| 婷婷精品进入| 亚洲最新免费视频| 日本精品三区| 天堂精品视频| 精品久久国产| 色999日韩自偷自拍美女| 欧美美女在线| 婷婷四房综合激情五月| 精品美女久久久| 色视频一区二区三区| 日韩黄色大片| 伊人久久大香线蕉精品| 日韩国产一区二区三区| 亚洲免费视频一区| 亚洲资源网站| 任我爽在线视频精品一| 国产成人精品三级高清久久91| 久久国产精品免费一区| 欧美男男freegayvideosroom| 国产一区二区三区免费不卡| 琪琪久久久久日韩精品| 欧美精品一区二区三区在线四季| 国产精品手机在线播放| 欧美一区二区三区在线播放| 久久伦理在线| 欧美xxxx吸乳| 欧美午夜a级限制福利片| 国产九九九九九| 欧美日韩国产亚洲一区| 九九九九免费视频| 欧美aⅴ一区二区三区视频| 狠狠躁狠狠躁视频专区| 国产毛片精品视频| 麻豆免费在线观看视频| 久久久精品日韩欧美| 99在线视频免费| 亚洲品质自拍视频| 国产第100页| 欧美日韩国产综合一区二区 | 97影院秋霞午夜在线观看| 97视频在线观看视频免费视频 | 自拍视频在线免费观看| 久久久精品美女| 国产精品xx| 国产主播在线一区| aiai久久| 日韩精品一区二区三区外面| 五月天激情综合网| 欧妇女乱妇女乱视频| 亚洲一区网站| 肉色超薄丝袜脚交| 91片黄在线观看| 黄色录像免费观看| 亚洲综合视频在线观看| 波多野结衣视频网站| 欧美影院一区二区三区| 亚洲av无码一区二区三区dv | 成人在线播放免费观看| 欧美亚洲日本黄色| 999精品嫩草久久久久久99| 麻豆91蜜桃| 国内精品久久久久久久影视麻豆 | 一本色道久久综合亚洲精品不卡| 亚洲精品性视频| 久久综合九色综合97婷婷女人| 成年人一级黄色片| 91成人免费在线| 亚洲欧美高清视频| 久久中文字幕视频| 香蕉视频亚洲一级| 国产精品日韩欧美一区二区三区 | 久久99久久99精品免观看软件| 91久久在线观看| 亚洲综合福利| 91午夜在线观看| 国产又黄又大久久| 亚洲精品国产精品乱码在线观看| 欧美日韩国产中文字幕| 国产xxxx孕妇| 日韩最新中文字幕电影免费看| 欧美大胆性生话| 国产精品区免费视频| 婷婷综合激情| 99热这里只有精品在线播放| 国产性天天综合网| 日韩美女黄色片| 日韩午夜中文字幕| 青青影院在线观看| 91久久嫩草影院一区二区| 欧美影院三区| 日日摸天天爽天天爽视频| 成人a免费在线看| 日韩美女黄色片| 精品国产一区二区三区av性色| 国产乱色在线观看| 国产精品一区二区三区久久久| 色综合久久一区二区三区| 黄色片视频在线播放| 91一区二区在线观看| 国产精品99精品无码视| 日韩av在线精品| 在线黄色的网站| 青青草成人激情在线| 午夜在线一区| 黄瓜视频污在线观看| 福利一区福利二区微拍刺激| 同心难改在线观看| 欧洲一区二区视频| 自拍偷拍精品| 热久久精品国产| 中文字幕二三区不卡| 最近国语视频在线观看免费播放| 亚洲精品aⅴ中文字幕乱码 | 欧美在线亚洲在线| 国产一区二区三区天码| 黄色一级二级三级| 中文字幕国产一区| 91久久久久久久久久久久| 欧美黄色片在线观看| 伊人精品久久| 北条麻妃在线视频观看| av福利精品导航| 五月激情丁香网| 日韩在线观看免费av| 欧美在线在线| 国产超级av在线| 国产日韩欧美麻豆| 国产精品久久综合青草亚洲AV| 日韩一区二区久久久| 亚洲乱码一区| 日本wwww视频| 国产精品免费视频观看| 亚洲黄色在线观看视频| 2025国产精品视频| 国产日产一区| 国产精品自在自线| 午夜视频在线观看一区二区三区| 无套内谢的新婚少妇国语播放| 奇米影视亚洲狠狠色| 国产精品成久久久久| 欧美图片自拍偷拍| 欧美性生交xxxxx久久久| 成在在线免费视频| 国产欧美日韩在线播放| 久久久久一区| 97在线观看视频免费| 日韩成人久久久| 99精品美女视频在线观看热舞| 18黄暴禁片在线观看| 中文字幕免费一区| 亚洲第一免费视频|