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

由一道Neusoft題中想到的Java日志API

開發 后端
我們仍然忽略任何第三方API,只要是Java API能完成的工作,我們不只用第三方工具。看了這個需求,其中需要進行日志的操作和數據格式化輸出,其余就是簡單IO和一個合并算法。日中日志我們可以使用java.util.logging的API,數據格式化就使用String.format()方法,下面我們來分析分析。

先來看看這一季度的試題的總體要求:

部門已經完成了多次編程考試,為了方便對每個人的考試情況進行跟蹤,需要

將所有人員的成績進行合并、匯總。

歷次考試成績格式為Excel格式,共有三列數據:郵件地址、姓名、成績。為了

簡化代碼實現,在統計時,會先將Excel格式的成績單“另存為”保存類型為“文本文件

(制表符分隔)(*.txt)”格式的文件,文件名稱格式為“yyyymm.txt”(即:4位年份2位

月分.txt),作為程序的輸入文件進行讀取、合并操作。

輸入文件保存在c:\test\src\文件夾下,此文件夾下不會有其它文件。在匯總處

理之前,我們會檢查此文件夾下的輸入文件,確保文件名符合輸入要求。

在讀取文件進行處理的過程中,如果遇到非法的數據,可以直接跳過當前人員的

成績,繼續處理其它數據。同時,需要將錯誤發生的源文件名,錯誤發生的行數,及

所在行內容記錄在日志文件c:\test\test.log文件中。

記錄信息為“數據錯誤:yyyymm.txt 第 N 行。”。其中,yyyymm.txt、N分別為實際

的文件名與行數。

合并后文件格式仍為文本文件,前兩列為:郵件地址、姓名,從第三列開始,按

考試日期先后順序逐一列出每次考試的成績,如果某次考試缺考,則成績以“--”

代替。合并后文件名稱為“result.txt”,保存在c:\test\文件夾下。

便于后續做進一步檢索與處理,輸出文件格式需要嚴格符合下面的要求:

1)不需要有表頭列,從文件***行開始即為人員的成績。

2)列寬與對齊方式:前兩列,“郵件地址”列寬30字符,左對齊;“姓名”列寬15

字符,左對齊;從第三列開始,列寬統一為4字符且右對齊。

3)每位人員的成績為一行數據,行末換行要符合windows平臺習慣。

4)人員成績按姓名的漢語拼音順序排序,如果姓名相同,按郵件地址字母順序排序。

附件給出輸入文件與輸出文件的示例,可仔細閱讀以幫助理解上述格式要求。

提示:1)如果采用Java語言完成,編程過程中可以使用apache commons包中的api(這個

建議與考查的內容無關,至少便于對文件讀寫,評分是不會有任何影響)。

例如:固定列寬并且有對齊要求的文本格式化,可以使用commons-lang包中StringUtils

提供的LeftPad、RightPad方法(當然,這現方式并不強制要求,你也可以直接使用jdk

提供的PrintWriter.printf或者String.format或者其它方法這現同樣的目的,選擇自己

熟悉的就可以)

除以上包以外,請使用j2se6.0的標準內容。引入其他第3方庫(如使用數據庫)并不符合

考試要求。

2)日志記錄推薦使用log4j或log4net。配置格式不做強制要求,但需要在源文件存在錯誤

時按要求記錄問題。

我們仍然忽略任何第三方API,只要是Java API能完成的工作,我們不只用第三方工具。看了這個需求,其中需要進行日志的操作和數據格式化輸出,其余就是簡單IO和一個合并算法。日中日志我們可以使用java.util.logging的API,數據格式化就使用String.format()方法,下面我們來分析分析。

要使用Java的日志API,結合使用比較多的Log4j,首先想到的是日志的配置,下面來看看如何配置Java的日志API:

Java代碼

 

 

  1. package logging;     
  2. import java.text.DateFormat;     
  3. import java.text.SimpleDateFormat;     
  4. import java.util.Date;     
  5. import java.util.logging.Formatter;     
  6. import java.util.logging.LogRecord;     
  7. /**    
  8.  * 日志記錄器格式    
  9.  *     
  10.  * @author Nanlei    
  11.  *     
  12.  */    
  13. public class LogFormatter extends Formatter {     
  14.     @Override    
  15.     public String format(LogRecord record) {     
  16.         Date date = new Date();     
  17.         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     
  18.         String dateStr = df.format(date);     
  19.         return "[" + dateStr + "] [" + record.getLevel() + "]"    
  20.                 + record.getClass() + " : " + record.getMessage() + "\n";     
  21.     }     
  22. }    

 

這個類是用來規范日志記錄格式的,我們自定義的日志記錄方式可以通過擴展Formatter類來進行,覆蓋其中的format方法即可,其中的程序是生成日期,然后返回我們要在日志中看到的日志格式,這都很好理解,就不多說什么了。

寫好了日志格式,那么在實際中該如何來使用呢,也很簡單:

Java代碼

 

 

  1. private static final Logger logger = Logger.getLogger(Main.class.getName());     
  2. private static void setLoggerSettings() throws Exception {     
  3.     logger.setLevel(Level.INFO);     
  4.     FileHandler fileHandler = new FileHandler("c:\\test\\test.log");     
  5.     fileHandler.setFormatter(new LogFormatter());     
  6.     logger.addHandler(fileHandler);     
  7. }    

 

在類中聲明一個靜態的成員變量,然后對其進行一些設置,這里包括日志級別,輸出位置和格式,那么格式就是上面那個類中設置的,調用setLoggerSettings()方法之后,就可以使用日志API了,這很簡單。

下面來分析題目需求,要從幾個文件中來讀取信息然后進行合并,文件中可能有非法數據,要進行處理。文件中的信息包括電子郵件,姓名和每次的成績,要求合并成績到一條記錄中,那么我們就要首先讀取這些信息,然后進行合并處理。信息是用制表符分隔的,那么讀取上來后就要根據制表符分割,如果發現分割出現問題,就記錄日志。

首先抽象出數據中的對象,就是考試記錄對象,我們簡單刻畫這個對象:

Java代碼

 

 

  1. package bean;     
  2. /**    
  3.  * 考試記錄bean    
  4.  *     
  5.  * @author Nanlei    
  6.  *     
  7.  */    
  8. public class ExamRecord {     
  9.     private String email;// 電子郵件     
  10.     private String name;// 人名     
  11.     private String record;// 單條成績     
  12.     private String[] records;// 考試記錄     
  13.     public ExamRecord() {     
  14.         super();     
  15.     }     
  16.     public ExamRecord(String email, String name, String record) {     
  17.         super();     
  18.         this.email = email;     
  19.         this.name = name;     
  20.         this.record = record;     
  21.     }     
  22.     public String getEmail() {     
  23.         return email;     
  24.     }     
  25.     public void setEmail(String email) {     
  26.         this.email = email;     
  27.     }     
  28.     public String getName() {     
  29.         return name;     
  30.     }     
  31.     public void setName(String name) {     
  32.         this.name = name;     
  33.     }     
  34.     public String getRecord() {     
  35.         return record;     
  36.     }     
  37.     public void setRecord(String record) {     
  38.         this.record = record;     
  39.     }     
  40.     public String[] getRecords() {     
  41.         return records;     
  42.     }     
  43.     public void setRecords(String[] records) {     
  44.         this.records = records;     
  45.     }     
  46.     @Override    
  47.     public String toString() {     
  48.         return "ExamRecord [email=" + email + ", name=" + name + ", record="    
  49.                 + record + ", records=" + records + "]";     
  50.     }     
  51. }   

 

這里可說的不多,主要是構造方法,重載的方法有一個是填充record的,就是每條記錄的成績,而records變量是我們后期進行填充的。

我們開始編寫readFromFile(String basePath)方法:

Java代碼

 

 

  1. Set flagSet = new TreeSet();     
  2. List infoList = new ArrayList();     
  3. List recordList = new ArrayList();     
  4. List recordsPerFile = new ArrayList();// 標識每個文件中合法記錄的數量    

 

這些變量用于對數據進行處理。flagSet一看名字就是一個標識位,為什么用Set,因為合并之后每人是一條記錄,那么處理后就合并了,而原始數據中一個人的信息可能有多條,那么我們要記錄到底有多少不重復的人,就使用Set了,它會為我們自動去除重復的,同時TreeSet會按找字母順序為我們自動排序,那么需求中的要求就滿足了,我們不用再寫排序的方法。InfoList用于放置從文件連續讀出的原始數據,recordList是方法返回的結果,也是我們寫入結果文件的最終對象,recordsPerFile是輔助變量,用于存儲從每個文件中讀取的文件數量,這是處理拼裝大規模數據的基本方法,用于后期數據處理時的循環變量控制。

Java代碼

 

 

  1. File file = new File(basePath);     
  2.         if (!file.isDirectory()) {     
  3.             logger.info(file.getAbsolutePath() + " is not a directory");     
  4.         } else {     
  5.             try {     
  6.                 String[] files = file.list();     
  7.                 for (int i = 0; i < files.length; i++) {     
  8.                     File targetFile = new File(basePath + "\\" + files[i]);     
  9.                     BufferedReader br = new BufferedReader(     
  10.                             new InputStreamReader(new FileInputStream(     
  11.                                     targetFile), "GBK"));     
  12.                     String s = null;     
  13.                     int line = 0;     
  14.                     int num = 0;     
  15.                     while ((s = br.readLine()) != null) {     
  16.                         if (line == 0) {     
  17.     
  18.                         } else {     
  19.                             String[] infos = s.split("\t");     
  20.                             if (infos.length != 3) {     
  21.                                 logger.info("錯誤數據 " + files[i] + " 第"    
  22.                                         + (line + 1) + "行");     
  23.                             } else {     
  24.                                 flagSet.add(infos[0] + "\t" + infos[1]);     
  25.                                 infoList.add(new ExamRecord(infos[0], infos[1],     
  26.                                         infos[2]));     
  27.                                 num++;     
  28.                             }     
  29.                         }     
  30.                         line++;     
  31.                     }     
  32.                     recordsPerFile.add(num);     
  33.                     br.close();     
  34.                 }     
  35.             } catch (Exception e) {     
  36.                 e.printStackTrace();     
  37.             }    

 

這部分就是從文件夾下讀取文件并寫入我們準備的變量中,首先進行文件夾判斷,之后開始讀取,我們將數據分行讀取,然后用split函數對原始數據進行分隔,如果沒有得到3個數據部分,那么視為該數據無效,就寫日志,如果獲取到了三個部分,首先將電子郵件和姓名存入Set,剩余信息存入infoList,使用輔助循環變量num來計算數量。

至此,我們已經讀取到所需數據了,下面就是對數據進行處理了,首先是對我們的結果recordList進行一些初始化操作:

Java代碼

復制代碼

 

 

  1. Iterator it = flagSet.iterator();     
  2.             String str = null;     
  3.             while (it.hasNext()) {     
  4.                 str = it.next();     
  5.                 String[] infos = str.split("\t");     
  6.                 ExamRecord er = new ExamRecord();     
  7.                 er.setEmail(infos[0]);     
  8.                 er.setName(infos[1]);     
  9.                 String[] arrays = new String[recordsPerFile.size()];     
  10.                 er.setRecords(arrays);     
  11.                 recordList.add(er);     
  12.             }    

 

這里我們可以從flagSet中獲取最終結果數量,然后對應寫入recordList并初始化records數組,就做完了,下面是對成績的處理了,這部分涉及到題目的核心算法,下面所示代表我的一個處理方式,可能不是***的:

Java代碼

 

 

  1. // 開始處理成績     
  2.             for (int i = 0; i < recordsPerFile.size(); i++) {     
  3.                 int num = recordsPerFile.get(i);     
  4.                 int count = 0;     
  5.                 while (count < recordList.size()) {     
  6.                     ExamRecord tmpER = recordList.get(count);     
  7.                     tmpER.getRecords()[i] = "--";     
  8.                     for (int j = 0; j < num; j++) {     
  9.                         ExamRecord er = infoList.get(j);     
  10.                         if (tmpER.getEmail().equals(er.getEmail())) {     
  11.                             tmpER.getRecords()[i] = er.getRecord();     
  12.                         }     
  13.                     }     
  14.                     count++;     
  15.                 }     
  16.                 for (int k = 0; k < num; k++) {     
  17.                     infoList.remove(0);     
  18.                 }     
  19.             }    

 

解釋一下:我們首先變量recordsPerFile,這里標識出一共讀取出幾個文件,每個文件中的記錄數量是多少,下面的while循環是變量recordList,就是我們每次要處理幾個用戶。進入while循環,首先獲取一個ExamRecord對象,然后對其成績欄位進行填充,如果沒有值,那么就是”--”,下面開始處理infoList部分,這里就看到輔助變量的用途了,因為每個文件中可能沒有全部人員的記錄,就是文件記錄數小于總人數,那么怎么辦呢,每次遍歷多少呢?就是輔助變量中記錄的數據,兩個集合的記錄數不同,也同時可以遍歷來進行對比處理,這就是一種方法,如果發現相同數據,在相應位置填充,***的for循環是刪除我們處理過的數據,每次刪除0號元素,刪除的次數是輔助變量中記錄的。此時我們的數據處理完成,獲得了recordList。

下面是寫入文件的操作:

Java代碼

 

 

  1. private static void writeResultToFile(String fileName,     
  2.         List recordList) {     
  3.     BufferedOutputStream output = null;     
  4.     try {     
  5.         output = new BufferedOutputStream(new FileOutputStream(fileName));     
  6.         for (int i = 0; i < recordList.size(); i++) {     
  7.             ExamRecord examRecord = recordList.get(i);     
  8.             output.write(String.format("%-30s", examRecord.getEmail())     
  9.                     .getBytes());     
  10.             output.write(String.format("%-15s", examRecord.getName())     
  11.                     .getBytes());     
  12.             for (int j = 0; j < examRecord.getRecords().length; j++) {     
  13.                 output.write(String.format("%4s",     
  14.                         examRecord.getRecords()[j]).getBytes());     
  15.             }     
  16.             output.write("\r\n".getBytes());     
  17.         }     
  18.         output.flush();     
  19.     } catch (Exception e) {     
  20.         e.printStackTrace();     
  21.     } finally {     
  22.         try {     
  23.             if (output != null) {     
  24.                 output.close();     
  25.             }     
  26.         } catch (IOException e) {     
  27.             e.printStackTrace();     
  28.         }     
  29.     }     
  30. }    

 

這里就沒什么多說的了,就是需求中要求對數據格式進行處理,左對齊還是右對齊也很簡單了。這里使用了C語言中printf()函數的格式,String的format()方法支持這點,就很簡單了。

主函數如下:

Java代碼

 

 

  1. public static void main(String[] args) throws Exception {     
  2.         long start = System.currentTimeMillis();     
  3.         // 設置Log     
  4.         setLoggerSettings();     
  5.         // 讀取文件到對象中     
  6.         List recordList = readFromFile("c:\\test\\src");     
  7.         // 將結果寫入文件     
  8.         writeResultToFile("c:\\test\\result.txt", recordList);     
  9.         long end = System.currentTimeMillis();     
  10.         System.out.println(end - start + " ms!");     
  11.     }    

 

執行主函數,就可以在相應位置看到結果。

 

 

原始數據和源碼見原文鏈接:

http://sarin.javaeye.com/blog/941386。

本文系作者本人的探索,希望大家批評指正。也希望和Neusofter們交流提高。

【編輯推薦】

  1. Java API解析名稱空間的幾種方法
  2. 發現Java虛擬機內存泄露問題
  3. Java編譯過程與c/c++編譯過程有何不同
  4. 程序員必備Java API
  5. VMWare發布虛擬基礎架構Java API及Jython腳本示例
責任編輯:金賀 來源: JavaEye博客
相關推薦

2021-05-09 19:42:25

筆試題前端算法

2024-03-18 13:32:11

2018-02-01 16:26:44

面試題static變量

2013-05-29 10:36:08

Android開發移動開發字符串反轉

2018-03-06 15:30:47

Java面試題

2021-03-02 11:29:50

算法算法分析前端

2014-02-26 09:13:39

2018-01-29 15:25:05

前端JSDate對象

2023-02-04 18:24:10

SeataJava業務

2011-08-18 09:33:23

2024-10-11 17:09:27

2014-04-29 14:58:24

筆試題微軟筆試題

2018-03-14 07:42:48

2011-05-23 11:27:32

面試題面試java

2022-04-08 14:50:37

存儲零信任安全

2020-08-07 11:23:31

網絡安全人工智能數據

2014-03-07 11:32:18

2014-02-24 10:45:00

2022-01-19 11:39:15

數據治理大數據數據

2009-12-16 09:58:35

Chrome OS
點贊
收藏

51CTO技術棧公眾號

99精品欧美一区二区三区| 亚洲女同精品视频| 中文字幕中文字幕99| 国产精品久久久久久久一区二区| 亚洲女同一区| 欧美不卡一区二区| 日本三级免费观看| 麻豆av在线免费看| 国产成人a级片| 日本精品一区二区三区在线播放视频| 一区二区三区在线观看免费视频| 自拍偷拍亚洲图片| 欧美日韩免费看| 中文字幕av日韩精品| 免费看黄色一级视频| 久久av一区二区三区| 久久影视电视剧免费网站清宫辞电视| 波多野结衣一二三区| 日本美女久久| 精品福利一区二区| 在线视频欧美一区| 毛片网站在线观看| 国产成人免费视频网站高清观看视频 | 97久久超碰| 欧美在线观看禁18| 2018日日夜夜| 99在线播放| 欧美激情在线观看视频免费| 国产经典一区二区三区| 在线免费观看视频网站| 亚洲一区视频| 欧美激情精品久久久久久黑人 | 日韩在线观看视频一区| 精品亚洲porn| 国产精品天天狠天天看| 性无码专区无码| 激情久久久久| 久久影院资源网| 免费成人深夜蜜桃视频| 伊人久久大香线蕉综合网蜜芽| 日韩午夜小视频| 色呦色呦色精品| 国产精品99精品一区二区三区∴| 黑人巨大精品欧美一区二区免费| 久久99中文字幕| 美女91在线| 亚洲乱码国产乱码精品精可以看| 亚洲午夜精品福利| 国产乱视频在线观看| 久久久久久久综合| 另类欧美小说| 日本一区二区三区在线观看视频| 不卡一区在线观看| 国产二区一区| 人妻视频一区二区三区| 国产v综合v亚洲欧| 国产精品国产精品国产专区蜜臀ah| 99精品免费观看| 国产乱子轮精品视频| 成人av.网址在线网站| 中文字幕人妻色偷偷久久| 日韩国产精品久久久| 国产国语刺激对白av不卡| 人妻丰满熟妇av无码区| 玖玖在线精品| 国产精品久久久久久久久免费| 久久人人爽人人爽人人片av免费| 日韩国产欧美在线视频| 91精品国产自产在线老师啪| 国产精品欧美综合亚洲| 国产剧情av麻豆香蕉精品| 99久久99久久精品国产片| 亚洲美女福利视频| av电影在线观看一区| 麻豆av一区二区三区久久| 三级视频在线| 国产精品麻豆网站| 特级黄色录像片| 草美女在线观看| 欧美视频二区36p| 免费看黄色一级大片| 激情久久99| 日韩一区二区免费高清| 在线免费看黄色片| 精品高清久久| 久久亚洲国产精品成人av秋霞| 天天干中文字幕| 国产亚洲网站| 国产精品无码专区在线观看| 午夜精品久久久久久久99热黄桃| www.欧美日韩国产在线| 日韩欧美精品一区二区| 福利在线视频网站| 黄色精品一区二区| 天天视频天天爽| 亚洲视频一起| 亚洲视频在线观看| 欧美高清视频一区二区三区| 国产亚洲激情| 亚洲精品日产aⅴ| 青青草在线免费观看| 亚洲欧洲另类国产综合| 青青青国产在线观看| julia一区二区三区中文字幕| 日韩一卡二卡三卡| 午夜时刻免费入口| 精品动漫3d一区二区三区免费版| 国产精品成av人在线视午夜片| jlzzjlzzjlzz亚洲人| 久久免费看少妇高潮| 特级西西444| 日韩不卡视频在线观看| 精品电影一区二区三区 | 国产成人短视频在线观看| 久久亚洲综合国产精品99麻豆精品福利 | 国内精品久久久久久久久电影网 | 久久影院午夜精品| 欧美久久一二三四区| 四虎精品在永久在线观看| 国产伦精品一区二区三区视频青涩 | 欧美办公室脚交xxxx| 欧美日韩高清在线播放| 菠萝菠萝蜜网站| 亚洲综合自拍| 国产精品久久久久久久久久新婚| 秋霞网一区二区| 国产精品免费免费| 久久9精品区-无套内射无码| 欧美欧美在线| 日韩在线视频免费观看| 久久久久99精品成人片我成大片 | 久久久久久久久免费看无码| 欧美日韩91| 91免费精品国偷自产在线| 国产视频第一区| 欧美日韩国产精品一区二区三区四区| 亚洲精品一区二区18漫画| 色喇叭免费久久综合网| 日韩av手机在线观看| 香蕉av在线播放| 亚洲二区在线视频| 精品无码av一区二区三区不卡| 久久精品国产亚洲夜色av网站| 国产精品99久久久久久久久久久久| 无码国产伦一区二区三区视频| 亚洲一区二区三区小说| 韩国一区二区三区四区| 正在播放日韩欧美一页 | 夜夜嗨aⅴ一区二区三区| 久久品道一品道久久精品| av免费观看网| 丝袜美腿综合| 青草青草久热精品视频在线网站| 天天综合在线视频| 婷婷成人激情在线网| 少妇一级淫免费观看| 亚洲另类黄色| 久久偷窥视频| 久九九久频精品短视频| 亚洲天堂色网站| 中文字幕在线观看第二页| 国产精品成人在线观看| 九九久久久久久| 中文字幕一区二区三区久久网站 | 国产男女裸体做爰爽爽| 亚洲人成电影网站色mp4| 丰满少妇一区二区三区专区| 黄色综合网站| 久久av一区二区三区亚洲| 精品91久久| 精品国偷自产在线| www.香蕉视频| 精品福利樱桃av导航| 亚洲第一黄色网址| 肉色丝袜一区二区| 欧美一级免费在线观看| 中文在线免费一区三区| 91精品国产91| 一本一道波多野毛片中文在线| 91精品国产综合久久国产大片| 久久久久久久久毛片| 北条麻妃一区二区三区| 国产一区亚洲二区三区| 日韩精品诱惑一区?区三区| 91日韩在线视频| www欧美xxxx| 一区二区三区黄色| 亚洲高清视频网站| 色哟哟精品一区| 91麻豆免费视频网站| 成人av在线资源| 中文字幕第21页| 黑丝一区二区| 色女人综合av| 国产精东传媒成人av电影| 国产成人自拍视频在线观看| a级毛片免费观看在线| 亚洲黄在线观看| 一二区在线观看| 黑人欧美xxxx| 国产第一页浮力| 99久久精品久久久久久清纯| www.超碰97.com| 亚洲一区二区三区免费在线观看| 中文字幕一区综合| 丝袜美腿一区二区三区动态图| 成人免费在线网址| 欧美在线极品| 九九精品在线观看| 在线视频自拍| 日韩精品在线播放| av资源免费看| 欧美三级欧美一级| 日韩av大片在线观看| 一区二区三区精品在线| 后入内射无码人妻一区| 91网站最新网址| 色网站在线视频| 免费不卡在线视频| 欧美老熟妇喷水| 欧美精品入口| 国产精品av免费| 亚洲精品一级二级三级| 爱情岛论坛亚洲入口| xxxxx.日韩| 日韩免费av一区二区| av中文资源在线资源免费观看| 久久精品国产成人精品| 懂色av中文在线| 亚洲毛片在线观看.| 色一情一乱一乱一区91av| 日韩一级完整毛片| 97在线播放免费观看| 欧美午夜视频网站| 一二三区免费视频| 日韩欧美国产一区二区| 亚洲精品午夜国产va久久成人| 亚洲午夜三级在线| 九九视频免费在线观看| 亚洲乱码一区二区三区在线观看| 欧美美女性生活视频| 国产精品毛片久久久久久久| 国产破处视频在线观看| 亚洲国产精品高清| 亚洲精品色午夜无码专区日韩| 久久综合给合久久狠狠狠97色69| 中文字幕在线观看网址| 99久久精品国产一区二区三区| 91视频啊啊啊| 99riav一区二区三区| 免费看黄色aaaaaa 片| 91在线国内视频| 人妻体内射精一区二区| 国产亚洲综合在线| 一级黄色毛毛片| 国产精品久久久久久久蜜臀 | 国内精品国产三级国产aⅴ久| 精品在线免费视频| 在线观看一区二区三区视频| 国产.欧美.日韩| 好吊色视频一区二区三区| 暴力调教一区二区三区| 全黄一级裸体片| 国产精品污污网站在线观看| 国产成人av免费在线观看| 一区二区三区中文字幕精品精品 | 欧洲一区二区三区免费视频| 天天操天天干天天摸| 欧美日韩国产电影| 成人黄色免费视频| 国产偷国产偷亚洲清高网站| av在线免费一区| 久久成人av网站| 91福利区在线观看| 国产成人精品在线观看| 涩涩涩久久久成人精品| 国产精品二区二区三区| 日韩精品福利一区二区三区| 日本免费高清一区二区| 91影院成人| www.99热这里只有精品| 肉丝袜脚交视频一区二区| 杨幂一区二区国产精品| 99久久国产综合色|国产精品| www久久久久久久| 亚洲精品第1页| 神马久久久久久久 | 日韩免费不卡av| 国产精品亚洲欧美一级在线| 精品日本一区二区三区| 日韩精品免费一区二区三区| r级无码视频在线观看| 青青草国产成人99久久| 4438x全国最大成人| 久久久久99精品一区| 国产一区二区播放| 色综合网站在线| 国产黄色大片网站| 亚洲欧洲在线观看| 牛牛精品在线视频| 国产精品免费在线免费| 粉嫩久久久久久久极品| 亚洲欧美日韩精品综合在线观看| 欧美日韩国产一区精品一区| 欧美精品成人网| 成人18视频日本| 麻豆一区在线观看| 一本一道久久a久久精品| a网站在线观看| 日韩亚洲国产中文字幕| 在线免费看h| 国产精品v欧美精品v日韩| 日韩免费久久| 国产免费成人在线| 国产不卡免费视频| 777777国产7777777| 在线免费不卡视频| 四虎成人免费在线| 欧美刺激性大交免费视频| 精品三区视频| 免费亚洲精品视频| 一级成人国产| 精品人妻一区二区免费| 1000精品久久久久久久久| 无码人妻精品一区二| 亚洲精品国产拍免费91在线| 污污的网站在线看| 91久热免费在线视频| 日韩欧美一区二区三区免费看| 国产xxxxx在线观看| gogogo免费视频观看亚洲一| 青娱乐国产在线| 91精品国产乱| 黄色网在线看| 国产精品专区一| 日韩理论电影院| 国产日韩欧美久久| 国产精品久久久久桃色tv| 瑟瑟视频在线免费观看| 一区二区三区精品99久久| 欧美色网一区| 日本一区高清不卡| 日日夜夜精品视频免费| 欧洲av一区二区三区| 91福利在线看| 成人午夜电影在线观看| 日韩免费在线播放| 深爱激情综合网| 日韩中文字幕免费在线| 国产丝袜欧美中文另类| www.久久久久久久| 亚洲一区av在线播放| 日韩精品免费观看视频| 色噜噜一区二区| 韩国成人精品a∨在线观看| 成人性生活毛片| 欧美成人r级一区二区三区| 美女尤物在线视频| 蜜桃视频在线观看91| 日韩精品每日更新| 中文字幕乱码av| 日韩视频一区二区三区在线播放| 日本欧美电影在线观看| 国产精品毛片va一区二区三区| 亚洲人www| 国产精品亚洲无码| 欧美日韩一区二区三区四区| 黄色免费在线观看网站| 福利视频一区二区三区| 一本不卡影院| 女人黄色一级片| 欧美一区二区在线视频| av剧情在线观看| 四虎一区二区| 国产福利91精品一区| 五月天婷婷综合网| 尤物精品国产第一福利三区 | 日本少妇xxxxx| 91精品国产全国免费观看| 国内高清免费在线视频| 你懂的网址一区二区三区| 美女网站在线免费欧美精品| 欧美成人免费观看视频| 日韩黄色在线免费观看| 成人国产一区| 亚洲理论电影在线观看| 国产亚洲女人久久久久毛片| 91在线观看喷潮| 97在线视频精品| 亚洲成av人片乱码色午夜| 成年人小视频在线观看| 欧美性一级生活| a毛片不卡免费看片| 小说区图片区图片区另类灬| 国产99一区视频免费| 天堂网一区二区| 欧美极品少妇与黑人| 精品福利久久久| 2一3sex性hd| 69成人精品免费视频|