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

深入淺出的分析 Properties

開發 后端
最近在看 java 集合源碼的時候,發現原來我們經常使用的 Properties 類既然繼承自 Hashtable!又漲見識了!

 最近在看 java 集合源碼的時候,發現原來我們經常使用的 Properties 類既然繼承自 Hashtable!又漲見識了!

[[281908]]

01. 摘要

在集合系列的第一章,咱們了解到,Map 的實現類有 HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties 等等。

在上一章節中,咱們介紹到 Hashtable 的數據結構和算法實現,在 Java 中其實還有一個非常重要的類 Properties,它繼承自 Hashtable,主要用于讀取配置文件。

本文通過看 JDK 和一些網友的博客總結,主要從 Properties 的用法實例來做介紹,如果有理解不當之處,歡迎指正。

02. 簡介

Properties 類是 java 工具包中非常重要的一個類,比如在實際開發中,有些變量,我們可以直接硬寫入到自定義的 java 枚舉類中。

但是有些變量,在測試環境、預生產環境、生產環境,變量所需要取的值都不一樣,這個時候,我們可以通過使用 properties 文件來加載程序需要的配置信息,以達到一行代碼,多處環境都可以運行的效果!

最常見的比如 JDBC 數據源配置文件,properties文件以.properties作為后綴,文件內容以鍵=值格式書寫,左邊是變量名稱,右邊是變量值,用#做注釋,比如新建一個jdbc.properties文件,內容如下:

Properties 類是 properties 文件和程序的中間橋梁,不論是從 properties 文件讀取信息,還是寫入信息到 properties 文件,都要經由 Properties 類。

好了,嘮叨了這么多,咱們回到本文要介紹的主角Properties!

從集合 Map 架構圖可以看出,Properties 繼承自 Hashtable,表示一個持久的 map 集合,屬性列表以 key-value 的形式存在,Properties 類定義如下:

  1. public class Properties extends Hashtable<Object,Object> { 
  2.     ...... 

Properties 除了繼承 Hashtable 中所定義的方法,Properties 也定義了以下幾個常用方法,如圖所示:

 

常用方法介紹

set 方法(添加修改元素)

set 方法是將指定的 key, value 對添加到 map 里,在添加元素的時候,調用了 Hashtable 的 put 方法,與 Hashtable 不同的是, key 和 value 都是字符串。

打開 Properties 的 setProperty 方法,源碼如下:

  1. public synchronized Object setProperty(String key, String value) { 
  2.     //調用父類 Hashtable 的 put 方法 
  3.     return put(key, value); 

方法測試如下:

  1. public static void main(String[] args) { 
  2.     Properties properties = new Properties(); 
  3.     properties.setProperty("name1","張三"); 
  4.     properties.setProperty("name2","張四"); 
  5.     properties.setProperty("name3","張五"); 
  6.     System.out.println(properties.toString()); 

輸出結果:

{name3=張五, name2=張四, name1=張三}

get 方法(搜索指定元素)

get 方法根據指定的 key 值返回對應的 value,第一步是從調用 Hashtable 的 get 方法,如果有返回值,直接返回;如果沒有返回值,但是初始化時傳入了defaults變量,從 defaults變量中,也就是 Properties 中,去搜索是否有對于的變量,如果有就返回元素值。

打開 Properties 的 getProperty 方法,源碼如下:

  1. public String getProperty(String key) { 
  2.     //調用父類 Hashtable 的 get 方法 
  3.     Object oval = super.get(key); 
  4.     String sval = (oval instanceof String) ? (String)oval : null
  5.      //進行變量非空判斷 
  6.     return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval; 

查看 defaults 這個變量,源碼如下:

  1. public class Properties extends Hashtable<Object,Object> { 
  2.     protected Properties defaults; 

這個變量在什么時候賦值呢,打開源碼如下:

  1. public Properties(Properties defaults) { 
  2.     this.defaults = defaults; 

可以發現,在 Properties 構造方法初始化階段,如果你給了一個自定義的 defaults ,當調用 Hashtable 的 get 方法沒有搜索到元素值的時候,并且 defaults 也不等于空,那么就會進一步在 defaults 里面進行搜索元素值。

方法測試如下:

  1. public static void main(String[] args) { 
  2.     Properties properties = new Properties(); 
  3.     properties.setProperty("name1","張三"); 
  4.     properties.setProperty("name2","張四"); 
  5.     properties.setProperty("name3","張五"); 
  6.     //將 properties 作為參數初始化到 newProperties 中 
  7.     Properties newProperties = new Properties(properties); 
  8.     newProperties.setProperty("name4","李三"); 
  9.     //查詢key中 name1 的值 
  10.     System.out.println("查詢結果:" + properties.getProperty("name1")); 

輸出結果:

通過key查詢結果:張三

load方法(加載配置文件)

load 方法,表示將 properties 文件以輸入流的形式加載文件,并且提取里面的鍵、值對,將鍵值對元素添加到 map 中去。

打開 Properties 的 load 方法,源碼如下:

  1. public synchronized void load(InputStream inStream) throws IOException { 
  2.     //讀取文件流 
  3.     load0(new LineReader(inStream)); 

load0 方法,源碼如下:

  1. private void load0 (LineReader lr) throws IOException { 
  2.     char[] convtBuf = new char[1024]; 
  3.     int limit; 
  4.     int keyLen; 
  5.     int valueStart; 
  6.     char c; 
  7.     boolean hasSep; 
  8.     boolean precedingBackslash; 
  9.  
  10.     //一行一行的讀取 
  11.     while ((limit = lr.readLine()) >= 0) { 
  12.         c = 0; 
  13.         keyLen = 0; 
  14.         valueStart = limit; 
  15.         hasSep = false
  16.  
  17.         precedingBackslash = false
  18.         //判斷key的長度 
  19.         while (keyLen < limit) { 
  20.             c = lr.lineBuf[keyLen]; 
  21.             if ((c == '=' ||  c == ':') && !precedingBackslash) { 
  22.                 valueStart = keyLen + 1; 
  23.                 hasSep = true
  24.                 break; 
  25.             } else if ((c == ' ' || c == '\t' ||  c == '\f') && !precedingBackslash) { 
  26.                 valueStart = keyLen + 1; 
  27.                 break; 
  28.             } 
  29.             if (c == '\\') { 
  30.                 precedingBackslash = !precedingBackslash; 
  31.             } else { 
  32.                 precedingBackslash = false
  33.             } 
  34.             keyLen++; 
  35.         } 
  36.         //獲取值的起始位置 
  37.         while (valueStart < limit) { 
  38.             c = lr.lineBuf[valueStart]; 
  39.             if (c != ' ' && c != '\t' &&  c != '\f') { 
  40.                 if (!hasSep && (c == '=' ||  c == ':')) { 
  41.                     hasSep = true
  42.                 } else { 
  43.                     break; 
  44.                 } 
  45.             } 
  46.             valueStart++; 
  47.         } 
  48.         //獲取文件中的鍵和值參數 
  49.         String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf); 
  50.         String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf); 
  51.         //調用 Hashtable 的 put 方法,將鍵值加入 map 中 
  52.         put(key, value); 
  53.     } 

好了,我們來在src/recources目錄下,新建一個custom.properties配置文件,內容如下:

  1. #定義一個變量名稱和值 
  2. userName=李三 
  3. userPwd=123456 
  4. userAge=18 
  5. userGender=男 
  6. userEmail=123@123.com 

方法測試如下:

  1. public class TestProperties  { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.         //初始化 Properties 
  5.         Properties prop = new Properties(); 
  6.         //加載配置文件 
  7.         InputStream in = TestProperties .class.getClassLoader().getResourceAsStream("custom.properties"); 
  8.         //讀取配置文件,指定編碼格式,避免讀取中文亂碼 
  9.         prop.load(new InputStreamReader(in"UTF-8")); 
  10.         //將內容輸出到控制臺 
  11.         prop.list(System.out); 
  12.     } 

輸出結果:

userPwd=123456

userEmail=123@123.com

userAge=18

userName=李三

userGender=男

propertyNames方法(讀取全部信息)

propertyNames 方法,表示讀取 Properties 的全部信息,本質是創建一個新的 Hashtable 對象,然后將原 Hashtable 中的數據復制到新的 Hashtable 中,并將 map 中的 key 全部返回。

打開 Properties 的 propertyNames 方法,源碼如下:

  1. public Enumeration<?> propertyNames() { 
  2.     Hashtable<String,Object> h = new Hashtable<>(); 
  3.     //將原 map 添加到新的 Hashtable 中 
  4.     enumerate(h); 
  5.     //返回 Hashtable 中全部的 key 元素 
  6.     return h.keys(); 

enumerate 方法,源碼如下:

  1. private synchronized void enumerate(Hashtable<String,Object> h) { 
  2.     //判斷 Properties 中是否有初始化的配置文件 
  3.     if (defaults != null) { 
  4.         defaults.enumerate(h); 
  5.     } 
  6.     //將原 Hashtable 中的數據添加到新的 Hashtable 中 
  7.     for (Enumeration<?> e = keys() ; e.hasMoreElements() ;) { 
  8.         String key = (String)e.nextElement(); 
  9.         h.put(key, get(key)); 
  10.     } 

方法測試如下:

  1. public static void main(String[] args) throws Exception { 
  2.     //初始化 Properties 
  3.     Properties prop = new Properties(); 
  4.     //加載配置文件 
  5.     InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("custom.properties"); 
  6.     //讀取配置文件,指定讀取編碼 UTF-8,防止內容亂碼 
  7.     prop.load(new InputStreamReader(in"UTF-8")); 
  8.     //獲取 Properties 中全部的 key 元素 
  9.     Enumeration enProp = prop.propertyNames(); 
  10.     while (enProp.hasMoreElements()){ 
  11.         String key = (String) enProp.nextElement(); 
  12.         String value = prop.getProperty(key); 
  13.         System.out.println(key + "=" + value); 
  14.     } 

輸出內容如下:

userPwd=123456

userEmail=123@123.com

userAge=18

userName=李三

userGender=男

總結

Properties 繼承自 Hashtable,大部分方法都復用于 Hashtable,比如,get、put、remove、clear 方法,**與 Hashtable 不同的是, Properties中的 key 和 value 都是字符串,**如果需要獲取 properties 中全部內容,可以先通過迭代器或者 propertyNames 方法獲取 map 中所有的 key 元素,然后遍歷獲取 key 和 value。

需要注意的是,Properties 中的 setProperty 、load 方法,都加了synchronized同步鎖,用來控制線程同步。

03. properties 文件的加載方式

在實際開發中,經常會遇到讀取配置文件路徑找不到,或者讀取文件內容亂碼的問題,下面簡單介紹一下,properties 文件的幾種常用的加載方式。

properties 加載文件的方式,大致可以分兩類,第一類是使用 java.util.Properties 的 load 方法來加載文件流;第二類是使用 java.util.ResourceBundle 類來獲取文件內容。

在src/recources目錄下,新建一個custom.properties配置文件,文件編碼格式為UTF-8,內容還是以剛剛那個測試為例,各個加載方式如下!

通過文件路徑來加載文件

這類方法加載文件,主要是調用 Properties 的 load 方法,獲取文件路徑,讀取文件以流的形式加載文件。

方法如下:

  1. Properties prop = new Properties(); 
  2. //獲取文件絕對路徑 
  3. String filePath = "/coding/java/src/resources/custom.properties"
  4. //加載配置文件 
  5. InputStream in = new FileInputStream(new File(filePath)); 
  6. //讀取配置文件 
  7. prop.load(new InputStreamReader(in"UTF-8")); 
  8. System.out.println("userName:"+prop.getProperty("userName")); 

輸出結果:

userName:李三 

通過當前類加載器的getResourceAsStream方法獲取

這類方法加載文件,也是調用 Properties 的 load 方法,不同的是,通過類加載器來獲取文件路徑,如果當前文件是在src/resources目錄下,那么直接傳入文件名就可以了。

方法如下:

  1. Properties prop = new Properties(); 
  2. //加載配置文件 
  3. InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("custom.properties"); 
  4. //讀取配置文件 
  5. prop.load(new InputStreamReader(in"UTF-8")); 
  6. System.out.println("userName:"+prop.getProperty("userName")); 

輸出結果:

userName:李三 

使用ClassLoader類的getSystemResourceAsStream方法獲取

和上面類似,也是通過類加載器來獲取文件流,方法如下:

Properties prop = new Properties();//加載配置文件InputStream in = ClassLoader.getSystemResourceAsStream("custom.properties");//讀取配置文件prop.load(new InputStreamReader(in, "UTF-8"));System.out.println("userName:"+prop.getProperty("userName"));

輸出結果:

userName:李三

使用 ResourceBundle 類加載文件

ResourceBundle 類加載文件,與 Properties 有所不同,ResourceBundle 獲取 properties 文件不需要加.properties后綴名,只需要文件名即可。

ResourceBundle 是按照iso8859編碼格式來讀取原屬性文件,如果是讀取中文內容,需要進行轉碼處理。

方法如下:

  1. //加載custom配置文件,不需要加`.properties`后綴名 
  2. ResourceBundle resource = ResourceBundle.getBundle("custom"); 
  3. //轉碼處理,解決讀取中文內容亂碼問題 
  4. String value = new String(resource.getString("userName").getBytes("ISO-8859-1"),"UTF-8"); 
  5. System.out.println("userName:"+value); 

輸出結果:

userName:李三

04. 總結

從源碼上可以看出,Properties 繼承自 Hashtable,大部分方法都復用于 Hashtable,與 Hashtable 不同的是, Properties 中的 key 和 value 都是字符串。

實際開發中,Properties 主要用于讀取配置文件,尤其是在不同的環境下,變量值需要不一樣的情況,可以通過讀取配置文件來避免將變量值寫死在 java 的枚舉類中,以達到一行代碼,多處運行的目的!

在讀取 Properties 配置文件的時候,容易因文件路徑找不到報錯,可以參考 properties 文件加載的幾種方式,

責任編輯:華軒 來源: Java極客技術
相關推薦

2019-11-14 09:53:30

Set集合存儲

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2013-11-14 15:53:53

AndroidAudioAudioFlinge

2009-11-30 16:46:29

學習Linux

2022-12-02 09:13:28

SeataAT模式

2021-07-20 15:20:02

FlatBuffers阿里云Java

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構調度器

2012-05-21 10:06:26

FrameworkCocoa

2022-09-26 09:01:15

語言數據JavaScript

2018-03-15 09:13:43

MySQL存儲引擎

2015-08-06 14:02:31

數據分析

2023-03-20 09:48:23

ReactJSX

2009-12-25 15:49:43

Linux rescu

2018-11-09 16:24:25

物聯網云計算云系統

2021-04-27 08:54:43

ConcurrentH數據結構JDK8

2022-11-09 08:06:15

GreatSQLMGR模式

2012-02-21 13:55:45

JavaScript

2022-10-31 09:00:24

Promise數組參數
點贊
收藏

51CTO技術棧公眾號

日本不卡的三区四区五区| 天海翼精品一区二区三区| 亚洲老司机在线| 国产传媒一区| 无码人妻丰满熟妇精品| 国产精品88久久久久久| 欧美精品一区二区三区在线| www.国产区| h片在线播放| 91久色porny| 91老司机在线| 天天干天天干天天| 欧美91大片| 一区二区三区黄色| 免费观看污网站| 久久日本片精品aaaaa国产| 亚洲一区二区三区爽爽爽爽爽| 日韩欧美电影一区二区| 亚洲精品字幕在线观看| 男女男精品视频网| 97久久久免费福利网址| 欧美色视频一区二区三区在线观看| 欧美调教视频| 日韩免费一区二区三区在线播放| 五月天婷婷激情视频| 黄色激情在线播放| 一区二区三区中文字幕在线观看| 日韩视频在线观看国产| 天堂网在线中文| 国产一区二区三区免费| 国产精品嫩草影院一区二区| 日韩精品在线不卡| 欧美另类视频| 日韩视频免费观看| 美国一级黄色录像| 精品视频亚洲| 亚洲乱码一区二区| 偷偷色噜狠狠狠狠的777米奇| 伊人久久大香| 欧美日韩中文字幕精品| 欧在线一二三四区| 黑人巨大精品| 欧美性生交xxxxx久久久| 欧美少妇在线观看| 国产丝袜在线| 亚洲视频中文字幕| 欧美一级黄色录像片| 无遮挡的视频在线观看| 中国av一区二区三区| 日本一区二区免费看| 天堂av在线免费观看| 国产一区二区毛片| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲成人av网址| 蜜桃视频免费观看一区| 国产一区二区丝袜| 一级特黄色大片| 激情欧美日韩一区二区| 91午夜在线播放| 国产黄色一级大片| 成人免费毛片aaaaa**| 国产精品18毛片一区二区| 欧美熟女一区二区| www.欧美精品一二区| 久久精品aaaaaa毛片| 亚洲欧美自偷自拍| 久久精品一二三| 天堂精品视频| 国内精品久久久久国产| 亚洲一区欧美一区| 国产主播在线看| 欧美日韩精品一区二区三区视频| 欧美性色欧美a在线播放| 亚洲天堂2018av| 国产一区二区三区视频在线| 精品久久久久久最新网址| 日本三级日本三级日本三级极| 日韩欧美国产大片| 国产亚洲成av人片在线观看桃| 999福利视频| 午夜电影亚洲| 欧美制服第一页| 国产精品视频久久久久久| 国产激情视频一区二区在线观看 | 午夜免费高清视频| 精品中文字幕一区二区三区| 亚洲大胆美女视频| 午夜时刻免费入口| 欧美精品黄色| 国产精品av在线播放| av网站在线免费看| 国产亚洲综合在线| 污污污污污污www网站免费| 女厕盗摄一区二区三区| 欧美日韩www| 成人啪啪18免费游戏链接| 国产伦精品一区二区三区千人斩| 欧美成人亚洲成人日韩成人| 国产一级淫片a视频免费观看| 精品亚洲欧美一区| 麻豆久久久av免费| av网站在线免费看推荐| 一本色道久久综合精品竹菊| 三级黄色片免费看| 欧美最新另类人妖| 97超级碰碰碰| 国产精品毛片一区二区在线看舒淇| 成人动漫视频在线| av不卡在线免费观看| 国产免费不卡| 精品国产一区二区三区av性色 | 色哟哟免费视频| 自拍亚洲一区| 久久久久久久久久亚洲| 91片黄在线观看喷潮| 国产亚洲欧美色| 亚洲熟妇国产熟妇肥婆| 久久三级中文| 日韩视频在线一区| 国产一区二区视频免费| 99久久国产综合色|国产精品| 亚洲永久激情精品| 日韩免费va| 国产丝袜一区视频在线观看 | 欧美日韩夫妻久久| 久久精品国产亚洲av久| 一区二区激情| 国产一区二区三区av在线| 乱人伦中文视频在线| 欧美在线视频不卡| 免费福利视频网站| 模特精品在线| 极品日韩久久| segui88久久综合9999| 欧美大片日本大片免费观看| 亚洲 欧美 变态 另类 综合| 蜜桃免费网站一区二区三区| 视频一区二区三区免费观看| 日本乱码一区二区三区不卡| 亚洲高清不卡av| 国产极品美女高潮无套嗷嗷叫酒店| 国产一区二区调教| 三年中文高清在线观看第6集| 国产综合色在线观看| 中文字幕亚洲激情| 一区二区视频在线免费观看| 国产精品久久毛片a| 九色porny自拍| 国产精品成久久久久| 国产在线观看精品一区二区三区| 色视频在线免费观看| 51精品秘密在线观看| 亚洲成人生活片| 国产成人综合在线播放| 国产欧美123| 伊人精品久久| 久久久亚洲福利精品午夜| 国产香蕉在线观看| 欧美日韩国产中文字幕| 性欧美丰满熟妇xxxx性仙踪林| 免费视频一区二区三区在线观看| 欧美一区二区三区成人久久片| 香蕉成人av| www.日韩av.com| 精品国产乱码久久久久久蜜臀网站| 亚洲精品久久久蜜桃| 亚洲av无码专区在线播放中文| 亚洲免费观看| 五月天丁香综合久久国产| 欧美三级电影网址| 欧美高清一级大片| 婷婷亚洲一区二区三区| 欧美综合视频在线观看| 欧美黄色aaa| 99久久99精品久久久久久 | 国产一区在线看| 真实国产乱子伦对白视频| 三级精品视频| 成人美女免费网站视频| sm久久捆绑调教精品一区| 一本色道久久综合狠狠躁篇怎么玩| 97精品人妻一区二区三区| 一区二区三区不卡视频 | 国产精品一区二区三区av麻| 成人激情在线播放| 蜜桃麻豆av在线| 在线播放国产一区中文字幕剧情欧美| 国产三级午夜理伦三级| 欧美午夜精品久久久久久浪潮| 调教驯服丰满美艳麻麻在线视频| 国产酒店精品激情| 男人操女人免费| 综合日韩在线| 日韩国产在线一区| 国产色噜噜噜91在线精品| 国产精品普通话| а√在线中文网新版地址在线| 一区二区亚洲欧洲国产日韩| 性少妇videosexfreexxx片| 色国产综合视频| 久草国产在线视频| 国产精品美女一区二区在线观看| 国产婷婷在线观看| 九一久久久久久| 美女av免费在线观看| 欧美日韩精品| 艳色歌舞团一区二区三区| 欧洲vs亚洲vs国产| 91久久精品www人人做人人爽| 黄色精品视频| 欧美做爰性生交视频| 日韩三级免费| 久久手机精品视频| 97视频在线观看网站| 亚洲精品久久久久久久久久久| 国产乱淫a∨片免费观看| 色婷婷久久久久swag精品 | 国产一区二区三区四区五区在线| 亚洲青青久久| 国产精品精品久久久| 在线观看爽视频| 亚州国产精品久久久| 日韩专区av| 久操成人在线视频| 黄色动漫在线观看| 日韩视频中文字幕| 在线观看a视频| 国产亚洲欧美日韩一区二区| 欧美中文在线| 亚洲精品在线不卡| 午夜视频1000| 日韩黄色在线免费观看| 视频污在线观看| 精品国产91久久久久久久妲己| av天堂一区二区三区| 4438亚洲最大| 99久久久国产精品无码网爆| 欧美日韩久久一区| 一女二男一黄一片| 欧美亚洲动漫制服丝袜| 欧美三级网站在线观看| 日本乱码高清不卡字幕| 好吊色在线视频| 在线精品视频免费播放| 日韩不卡高清视频| 欧美视频一区二区三区| 亚洲一级av毛片| 欧美高清激情brazzers| 国产又粗又长又大视频| 777a∨成人精品桃花网| 国产三级精品在线观看| 欧美成人精品高清在线播放| 丰满人妻一区二区三区无码av | 成人激情在线观看| 精品成人18| 官网99热精品| 卡一精品卡二卡三网站乱码| 久久精品国产精品国产精品污 | 午夜成人免费影院| 亚洲成年人影院在线| 神马精品久久| 中文字幕日韩欧美在线 | 亚洲码国产岛国毛片在线| 日本天堂中文字幕| 精品成人av一区| www.久久视频| 6080日韩午夜伦伦午夜伦| 精品人妻一区二区三区三区四区| 亚洲国产精品成人一区二区| 韩日视频在线| 久久不射电影网| 日韩脚交footjobhd| 国产精品一香蕉国产线看观看| 动漫一区二区三区| 国产青春久久久国产毛片| 欧美**字幕| 天天成人综合网| 亚洲久久视频| 中文字幕在线综合| 成人国产电影网| 亚洲无人区码一码二码三码的含义| 亚洲欧美日韩久久精品| 日韩黄色精品视频| 欧美色男人天堂| 国产综合在线播放| 在线播放国产精品| 爱啪啪综合导航| 国产在线精品播放| 校园春色另类视频| 欧美日韩在线免费观看视频| 中文精品在线| 在线免费看v片| 久久久久久麻豆| 欧美久久久久久久久久久久| 91久久久免费一区二区| 午夜精品久久久久久久99| 国产亚洲一区二区精品| 成人三级小说| 成人免费xxxxx在线观看| 最新亚洲精品| 岛国大片在线播放| 久久国产精品露脸对白| 在线不卡av电影| 亚洲一区二区视频| 91麻豆成人精品国产| 亚洲视频在线观看免费| www.九色在线| 444亚洲人体| 91久久电影| 中文字幕在线观看第三页| 99视频精品在线| 国产女人被狂躁到高潮小说| 欧美在线观看一二区| 色视频在线观看| 久久久欧美精品| 中文字幕亚洲在线观看| 色撸撸在线观看| 久久丁香综合五月国产三级网站 | 九九视频免费观看视频精品| 成人av在线播放观看| 极品少妇xxxx精品少妇| 18啪啪污污免费网站| 色偷偷久久一区二区三区| 亚洲人成色777777精品音频| 久久久亚洲福利精品午夜| 午夜视频一区二区在线观看| 最新中文字幕久久| 精品一区二区三区的国产在线播放| 国产成人无码精品久久二区三| 精品国产乱码久久久久久虫虫漫画 | 国产一区二区成人久久免费影院 | 国产精品啊啊啊| 免费成年人高清视频| 国产精品水嫩水嫩| 毛片在线免费播放| 国产一区二区动漫| 久久久成人av毛片免费观看| 日本不卡一区| 日韩精品电影一区亚洲| 欧美丰满老妇熟乱xxxxyyy| 91久久免费观看| 秋霞午夜在线观看| 成人午夜激情免费视频| 伊人色**天天综合婷婷| 日本少妇激三级做爰在线| 亚洲人亚洲人成电影网站色| 国产美女永久免费| 欧美区在线播放| 精品亚洲自拍| 国产亚洲天堂网| 日本一区二区视频在线观看| 夜夜爽8888| 久久精品电影网站| 日韩精品一区二区三区中文| 99在线观看视频免费| 99国产精品国产精品久久| 免费看污视频的网站| www.日韩.com| 大陆精大陆国产国语精品| 日韩小视频在线播放| 久久久久久久久久久久久久久99 | 久久久av免费| 国产美女亚洲精品7777| 中文字幕日韩精品无码内射| 99久久综合色| 国产精品高清无码| 久久久99免费视频| 久9re热视频这里只有精品| av观看免费在线| 中文字幕一区在线| 亚洲精品18在线观看| 青青在线视频一区二区三区| 日韩大片在线播放| 日本wwwwwww| 色妹子一区二区| 国产福利视频在线观看| 国产亚洲情侣一区二区无| 日本女人一区二区三区| 欧美精品色哟哟| 亚洲人成网站777色婷婷| 亚洲欧美在线人成swag| 男人天堂1024| 国产精品久久精品日日| 色屁屁草草影院ccyycom| 国产精品白嫩初高中害羞小美女 | 国产精品无码av无码| 亚洲男人的天堂网| 你懂的好爽在线观看| 114国产精品久久免费观看| 免费在线成人| 777777国产7777777| 亚洲女人天堂av| 亚洲视频精选| 亚洲成人av免费看| 亚洲国产中文字幕| 日韩子在线观看| 欧美日韩在线播放一区二区| 国产精品一区免费在线观看| 久久精品久久久久久久| 欧美激情欧美狂野欧美精品|