婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談Golang是如何讀取文件內(nèi)容的(7種)

淺談Golang是如何讀取文件內(nèi)容的(7種)

熱門標(biāo)簽:福州鐵通自動外呼系統(tǒng) 濮陽自動外呼系統(tǒng)代理 澳門防封電銷卡 智能電銷機(jī)器人營銷 賺地圖標(biāo)注的錢犯法嗎 烏魯木齊人工電銷機(jī)器人系統(tǒng) 地圖標(biāo)注測試 廣東語音外呼系統(tǒng)供應(yīng)商 長沙ai機(jī)器人電銷

本文旨在快速介紹Go標(biāo)準(zhǔn)庫中讀取文件的許多選項(xiàng)。

在Go中(就此而言,大多數(shù)底層語言和某些動態(tài)語言(如Node))返回字節(jié)流。 不將所有內(nèi)容自動轉(zhuǎn)換為字符串的好處是,其中之一是避免昂貴的字符串分配,這會增加GC壓力。

為了使本文更加簡單,我將使用string(arrayOfBytes)將bytes數(shù)組轉(zhuǎn)換為字符串。 但是,在發(fā)布生產(chǎn)代碼時(shí),不應(yīng)將其作為一般建議。

1.讀取整個(gè)文件到內(nèi)存中

首先,標(biāo)準(zhǔn)庫提供了多種功能和實(shí)用程序來讀取文件數(shù)據(jù)。我們將從os軟件包中提供的基本情況開始。這意味著兩個(gè)先決條件:

  • 該文件必須容納在內(nèi)存中
  • 我們需要預(yù)先知道文件的大小,以便實(shí)例化一個(gè)足以容納它的緩沖區(qū)。

有了os.File對象的句柄,我們可以查詢大小并實(shí)例化一個(gè)字節(jié)列表。

package main


import (
 "os"
 "fmt"
)
func main() {
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 fileinfo, err := file.Stat()
 if err != nil {
 fmt.Println(err)
 return
 }

 filesize := fileinfo.Size()
 buffer := make([]byte, filesize)

 bytesread, err := file.Read(buffer)
 if err != nil {
 fmt.Println(err)
 return
 }
 fmt.Println("bytes read: ", bytesread)
 fmt.Println("bytestream to string: ", string(buffer))
}

2.以塊的形式讀取文件

雖然大多數(shù)情況下可以一次讀取文件,但有時(shí)我們還是想使用一種更加節(jié)省內(nèi)存的方法。例如,以某種大小的塊讀取文件,處理它們,并重復(fù)直到結(jié)束。在下面的示例中,使用的緩沖區(qū)大小為100字節(jié)。

package main


import (
 "io"
 "os"
 "fmt"
)

const BufferSize = 100

func main() {
 
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 buffer := make([]byte, BufferSize)

 for {
 bytesread, err := file.Read(buffer)
 if err != nil {
  if err != io.EOF {
  fmt.Println(err)
  }
  break
 }
 fmt.Println("bytes read: ", bytesread)
 fmt.Println("bytestream to string: ", string(buffer[:bytesread]))
 }
}

與完全讀取文件相比,主要區(qū)別在于:

  • 讀取直到獲得EOF標(biāo)記,因此我們?yōu)閑rr == io.EOF添加了特定檢查
  • 我們定義了緩沖區(qū)的大小,因此我們可以控制所需的“塊”大小。 如果操作系統(tǒng)正確地將正在讀取的文件緩存起來,則可以在正確使用時(shí)提高性能。
  • 如果文件大小不是緩沖區(qū)大小的整數(shù)倍,則最后一次迭代將僅將剩余字節(jié)數(shù)添加到緩沖區(qū)中,因此調(diào)用buffer [:bytesread]。 在正常情況下,bytesread將與緩沖區(qū)大小相同。

對于循環(huán)的每次迭代,都會更新內(nèi)部文件指針。 下次讀取時(shí),將返回從文件指針偏移開始直到緩沖區(qū)大小的數(shù)據(jù)。 該指針不是語言的構(gòu)造,而是操作系統(tǒng)之一。 在Linux上,此指針是要?jiǎng)?chuàng)建的文件描述符的屬性。 所有的read / Read調(diào)用(分別在Ruby / Go中)在內(nèi)部都轉(zhuǎn)換為系統(tǒng)調(diào)用并發(fā)送到內(nèi)核,并且內(nèi)核管理此指針。

3.并發(fā)讀取文件塊

如果我們想加快對上述塊的處理,該怎么辦?一種方法是使用多個(gè)go例程!與串行讀取塊相比,我們需要做的另一項(xiàng)工作是我們需要知道每個(gè)例程的偏移量。請注意,當(dāng)目標(biāo)緩沖區(qū)的大小大于剩余的字節(jié)數(shù)時(shí),ReadAt的行為與Read的行為略有不同。

另請注意,我并沒有限制goroutine的數(shù)量,它僅由緩沖區(qū)大小來定義。實(shí)際上,此數(shù)字可能會有上限。

package main

import (
 "fmt"
 "os"
 "sync"
)

const BufferSize = 100

type chunk struct {
 bufsize int
 offset int64
}

func main() {
 
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 fileinfo, err := file.Stat()
 if err != nil {
 fmt.Println(err)
 return
 }

 filesize := int(fileinfo.Size())
 // Number of go routines we need to spawn.
 concurrency := filesize / BufferSize
 // buffer sizes that each of the go routine below should use. ReadAt
 // returns an error if the buffer size is larger than the bytes returned
 // from the file.
 chunksizes := make([]chunk, concurrency)

 // All buffer sizes are the same in the normal case. Offsets depend on the
 // index. Second go routine should start at 100, for example, given our
 // buffer size of 100.
 for i := 0; i  concurrency; i++ {
 chunksizes[i].bufsize = BufferSize
 chunksizes[i].offset = int64(BufferSize * i)
 }

 // check for any left over bytes. Add the residual number of bytes as the
 // the last chunk size.
 if remainder := filesize % BufferSize; remainder != 0 {
 c := chunk{bufsize: remainder, offset: int64(concurrency * BufferSize)}
 concurrency++
 chunksizes = append(chunksizes, c)
 }

 var wg sync.WaitGroup
 wg.Add(concurrency)

 for i := 0; i  concurrency; i++ {
 go func(chunksizes []chunk, i int) {
  defer wg.Done()

  chunk := chunksizes[i]
  buffer := make([]byte, chunk.bufsize)
  bytesread, err := file.ReadAt(buffer, chunk.offset)

  if err != nil {
  fmt.Println(err)
  return
  }

  fmt.Println("bytes read, string(bytestream): ", bytesread)
  fmt.Println("bytestream to string: ", string(buffer))
 }(chunksizes, i)
 }

 wg.Wait()
}

與以前的任何方法相比,這種方法要多得多:

  • 我正在嘗試創(chuàng)建特定數(shù)量的Go例程,具體取決于文件大小和緩沖區(qū)大?。ㄔ诒纠袨?00)。
  • 我們需要一種方法來確保我們正在“等待”所有執(zhí)行例程。 在此示例中,我使用的是wait group。
  • 在每個(gè)例程結(jié)束的時(shí)候,從內(nèi)部發(fā)出信號,而不是break for循環(huán)。因?yàn)槲覀冄訒r(shí)調(diào)用了wg.Done(),所以在每個(gè)例程返回的時(shí)候才調(diào)用它。

注意:始終檢查返回的字節(jié)數(shù),并重新分配輸出緩沖區(qū)。

使用Read()讀取文件可以走很長一段路,但是有時(shí)您需要更多的便利。Ruby中經(jīng)常使用的是IO函數(shù),例如each_line,each_char, each_codepoint 等等.通過使用Scanner類型以及bufio軟件包中的關(guān)聯(lián)函數(shù),我們可以實(shí)現(xiàn)類似的目的。

bufio.Scanner類型實(shí)現(xiàn)帶有“ split”功能的函數(shù),并基于該功能前進(jìn)指針。例如,對于每個(gè)迭代,內(nèi)置的bufio.ScanLines拆分函數(shù)都會使指針前進(jìn),直到下一個(gè)換行符為止.

在每個(gè)步驟中,該類型還公開用于獲取開始位置和結(jié)束位置之間的字節(jié)數(shù)組/字符串的方法。

package main

import (
 "fmt"
 "os"
 "bufio"
)

const BufferSize = 100

type chunk struct {
 bufsize int
 offset int64
}

func main() {
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()
 scanner := bufio.NewScanner(file)
 scanner.Split(bufio.ScanLines)

 // Returns a boolean based on whether there's a next instance of `\n`
 // character in the IO stream. This step also advances the internal pointer
 // to the next position (after '\n') if it did find that token.
 for {
 read := scanner.Scan()
 if !read {
  break
  
 }
 fmt.Println("read byte array: ", scanner.Bytes())
 fmt.Println("read string: ", scanner.Text())
 }
 
}

因此,要以這種方式逐行讀取整個(gè)文件,可以使用如下所示的內(nèi)容:

package main

import (
 "bufio"
 "fmt"
 "os"
)

func main() {
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 scanner := bufio.NewScanner(file)
 scanner.Split(bufio.ScanLines)

 // This is our buffer now
 var lines []string

 for scanner.Scan() {
 lines = append(lines, scanner.Text())
 }

 fmt.Println("read lines:")
 for _, line := range lines {
 fmt.Println(line)
 }
}

4.逐字掃描

bufio軟件包包含基本的預(yù)定義拆分功能:

  • ScanLines (默認(rèn))
  • ScanWords
  • ScanRunes(對于遍歷UTF-8代碼點(diǎn)(而不是字節(jié))非常有用)
  • ScanBytes

因此,要讀取文件并在文件中創(chuàng)建單詞列表,可以使用如下所示的內(nèi)容:

package main

import (
 "bufio"
 "fmt"
 "os"
)

func main() {
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 scanner := bufio.NewScanner(file)
 scanner.Split(bufio.ScanWords)

 var words []string

 for scanner.Scan() {
 words = append(words, scanner.Text())
 }

 fmt.Println("word list:")
 for _, word := range words {
 fmt.Println(word)
 }
}

ScanBytes拆分函數(shù)將提供與早期Read()示例相同的輸出。 兩者之間的主要區(qū)別是在掃描程序中,每次需要附加到字節(jié)/字符串?dāng)?shù)組時(shí),動態(tài)分配問題。 可以通過諸如將緩沖區(qū)預(yù)初始化為特定長度的技術(shù)來避免這種情況,并且只有在達(dá)到前一個(gè)限制時(shí)才增加大小。 使用與上述相同的示例:

package main

import (
 "bufio"
 "fmt"
 "os"
)

func main() {
 file, err := os.Open("filetoread.txt")
 if err != nil {
 fmt.Println(err)
 return
 }
 defer file.Close()

 scanner := bufio.NewScanner(file)
 scanner.Split(bufio.ScanWords)

 // initial size of our wordlist
 bufferSize := 50
 words := make([]string, bufferSize)
 pos := 0

 for scanner.Scan() {
 if err := scanner.Err(); err != nil {
  // This error is a non-EOF error. End the iteration if we encounter
  // an error
  fmt.Println(err)
  break
 }

 words[pos] = scanner.Text()
 pos++

 if pos >= len(words) {
  // expand the buffer by 100 again
  newbuf := make([]string, bufferSize)
  words = append(words, newbuf...)
 }
 }

 fmt.Println("word list:")
 // we are iterating only until the value of "pos" because our buffer size
 // might be more than the number of words because we increase the length by
 // a constant value. Or the scanner loop might've terminated due to an
 // error prematurely. In this case the "pos" contains the index of the last
 // successful update.
 for _, word := range words[:pos] {
 fmt.Println(word)
 }
}

因此,我們最終要進(jìn)行的切片“增長”操作要少得多,但最終可能要根據(jù)緩沖區(qū)大小和文件中的單詞數(shù)在結(jié)尾處留出一些空插槽,這是一個(gè)折衷方案。

5.將長字符串拆分為單詞

bufio.NewScanner使用滿足io.Reader接口的類型作為參數(shù),這意味著它將與定義了Read方法的任何類型一起使用。
標(biāo)準(zhǔn)庫中返回reader類型的string實(shí)用程序方法之一是strings.NewReader函數(shù)。當(dāng)從字符串中讀取單詞時(shí),我們可以將兩者結(jié)合起來:

package main

import (
 "bufio"
 "fmt"
 "strings"
)

func main() {
 longstring := "This is a very long string. Not."
 var words []string
 scanner := bufio.NewScanner(strings.NewReader(longstring))
 scanner.Split(bufio.ScanWords)

 for scanner.Scan() {
 words = append(words, scanner.Text())
 }

 fmt.Println("word list:")
 for _, word := range words {
 fmt.Println(word)
 }
}

6.掃描以逗號分隔的字符串

手動解析CSV文件/字符串通過基本的file.Read()或者Scanner類型是復(fù)雜的。因?yàn)楦鶕?jù)拆分功能bufio.ScanWords,“單詞”被定義為一串由unicode空間界定的符文。讀取各個(gè)符文并跟蹤緩沖區(qū)的大小和位置(例如在詞法分析中所做的工作)是太多的工作和操作。

但這可以避免。 我們可以定義一個(gè)新的拆分函數(shù),該函數(shù)讀取字符直到讀者遇到逗號,然后在調(diào)用Text()或Bytes()時(shí)返回該塊。bufio.SplitFunc函數(shù)的函數(shù)簽名如下所示:

type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

為簡單起見,我展示了一個(gè)讀取字符串而不是文件的示例。 使用上述簽名的CSV字符串的簡單閱讀器可以是:

package main

import (
 "bufio"
 "bytes"
 "fmt"
 "strings"
)

func main() {
 csvstring := "name, age, occupation"

 // An anonymous function declaration to avoid repeating main()
 ScanCSV := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
 commaidx := bytes.IndexByte(data, ',')
 if commaidx > 0 {
  // we need to return the next position
  buffer := data[:commaidx]
  return commaidx + 1, bytes.TrimSpace(buffer), nil
 }

 // if we are at the end of the string, just return the entire buffer
 if atEOF {
  // but only do that when there is some data. If not, this might mean
  // that we've reached the end of our input CSV string
  if len(data) > 0 {
  return len(data), bytes.TrimSpace(data), nil
  }
 }

 // when 0, nil, nil is returned, this is a signal to the interface to read
 // more data in from the input reader. In this case, this input is our
 // string reader and this pretty much will never occur.
 return 0, nil, nil
 }

 scanner := bufio.NewScanner(strings.NewReader(csvstring))
 scanner.Split(ScanCSV)

 for scanner.Scan() {
 fmt.Println(scanner.Text())
 }
}

7.ioutil

我們已經(jīng)看到了多種讀取文件的方式.但是,如果您只想將文件讀入緩沖區(qū)怎么辦?
ioutil是標(biāo)準(zhǔn)庫中的軟件包,其中包含一些使它成為單行的功能。

讀取整個(gè)文件

package main

import (
 "io/ioutil"
 "log"
 "fmt"
)

func main() {
 bytes, err := ioutil.ReadFile("filetoread.txt")
 if err != nil {
 log.Fatal(err)
 }

 fmt.Println("Bytes read: ", len(bytes))
 fmt.Println("String read: ", string(bytes))
}

這更接近我們在高級腳本語言中看到的內(nèi)容。

讀取文件的整個(gè)目錄

不用說,如果您有大文件,請不要運(yùn)行此腳本

package main

import (
 "io/ioutil"
 "log"
 "fmt"
)

func main() {
 filelist, err := ioutil.ReadDir(".")
 if err != nil {
 log.Fatal(err)
 }
 for _, fileinfo := range filelist {
 if fileinfo.Mode().IsRegular() {
  bytes, err := ioutil.ReadFile(fileinfo.Name())
  if err != nil {
  log.Fatal(err)
  }
  fmt.Println("Bytes read: ", len(bytes))
  fmt.Println("String read: ", string(bytes))
 }
 }
}

參考文獻(xiàn)

go語言讀取文件概述

到此這篇關(guān)于淺談Golang是如何讀取文件內(nèi)容的(7種)的文章就介紹到這了,更多相關(guān)Golang讀取文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • golang文件讀取-按指定BUFF大小讀取方式
  • golang逐行讀取文件的操作
  • Golang 實(shí)現(xiàn)分片讀取http超大文件流和并發(fā)控制
  • golang 使用 viper 讀取自定義配置文件
  • 如何利用Golang解析讀取Mysql備份文件
  • golang讀取文件的常用方法總結(jié)
  • Golang 實(shí)現(xiàn)超大文件讀取的兩種方法

標(biāo)簽:廣西 阿克蘇 太原 西雙版納 德州 貴陽 慶陽 調(diào)研邀請

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Golang是如何讀取文件內(nèi)容的(7種)》,本文關(guān)鍵詞  淺談,Golang,是,如何,讀取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Golang是如何讀取文件內(nèi)容的(7種)》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談Golang是如何讀取文件內(nèi)容的(7種)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一级精品在线| 欧美色倩网站大全免费| 美日韩一区二区三区| 亚洲动漫第一页| 粉嫩嫩av羞羞动漫久久久 | 无吗不卡中文字幕| 一区二区三区.www| 亚洲高清中文字幕| 日韩国产欧美视频| 麻豆国产一区二区| 国产剧情一区二区| 成人高清视频在线观看| av激情亚洲男人天堂| 99精品在线免费| 亚洲欧洲成人av每日更新| 国产精品久久久久久久久免费桃花 | 国产欧美日韩在线视频| 国产精品视频观看| 一区二区激情视频| 日韩av电影免费观看高清完整版在线观看 | 国产区在线观看成人精品 | 国产精品视频一二| 亚洲一区二区影院| 久久国产精品区| 国产成人在线电影| 色94色欧美sute亚洲线路二| 337p亚洲精品色噜噜噜| 久久精品亚洲精品国产欧美| 成人欧美一区二区三区视频网页| 亚洲自拍偷拍九九九| 国产在线不卡视频| 91麻豆国产精品久久| 欧美日本免费一区二区三区| 欧美成人aa大片| 亚洲日本va午夜在线影院| 免费观看日韩av| 91丝袜美腿高跟国产极品老师 | 91成人免费网站| 欧美成人福利视频| 亚洲一区二区视频在线观看| 国产乱人伦精品一区二区在线观看| 99re热这里只有精品免费视频 | 岛国精品在线观看| 欧美性大战久久久久久久| 精品理论电影在线观看 | 精品国产污污免费网站入口| 一区二区三区高清| 国产99一区视频免费| 欧美一区二区三区小说| 亚洲与欧洲av电影| 91尤物视频在线观看| 久久综合九色综合久久久精品综合 | 欧美色偷偷大香| 亚洲欧洲国产日韩| 国产精品一区二区男女羞羞无遮挡 | 日韩高清不卡一区二区三区| 成人综合在线视频| 精品国产91洋老外米糕| 热久久国产精品| 欧美日韩国产乱码电影| 亚洲激情图片小说视频| 成人毛片在线观看| 国产亚洲欧洲一区高清在线观看| 麻豆国产精品官网| 日韩精品一区国产麻豆| 日韩中文字幕亚洲一区二区va在线 | 99视频精品全部免费在线| 久久嫩草精品久久久久| 精品一区二区影视| 日韩精品一区二区三区视频| 日韩精品91亚洲二区在线观看| 欧美三级日韩三级| 日韩精品一区第一页| 欧美日韩中文字幕一区| 午夜精品福利视频网站| 欧美精品一级二级三级| 日本中文字幕一区| 日韩精品一区二区三区视频| 久久精品噜噜噜成人88aⅴ | 一区二区在线电影| 欧美亚洲一区二区三区四区| 亚洲影院免费观看| 91精品婷婷国产综合久久| 日韩国产高清在线| 日韩久久久精品| 国产一区二区三区免费在线观看| 久久综合九色综合97婷婷| 国产一区二区三区观看| 国产精品免费视频观看| 91国偷自产一区二区三区成为亚洲经典| 国产精品午夜久久| 欧美优质美女网站| 日韩成人精品在线观看| xnxx国产精品| 91国内精品野花午夜精品| 日韩国产一区二| 久久女同性恋中文字幕| 91视频你懂的| 久久精品国产一区二区| 欧美激情艳妇裸体舞| 91丨porny丨蝌蚪视频| 婷婷久久综合九色国产成人| 久久综合狠狠综合| 欧美综合在线视频| 国产精品中文字幕日韩精品| 亚洲欧洲av另类| 日韩精品自拍偷拍| 色综合久久天天综合网| 琪琪久久久久日韩精品| 中文字幕一区二区三区在线不卡| 欧美日本一区二区| 成av人片一区二区| 精品中文字幕一区二区小辣椒| 日韩美女视频19| 精品国产一二三| 欧美日韩色一区| av不卡在线播放| 激情伊人五月天久久综合| 亚洲在线免费播放| 国产精品你懂的在线欣赏| 精品久久久久一区二区国产| 一本大道久久精品懂色aⅴ| 精品福利av导航| 一本在线高清不卡dvd| 国产酒店精品激情| 美女视频黄频大全不卡视频在线播放| 亚洲欧美一区二区三区国产精品| 日韩免费看的电影| 欧美精品v国产精品v日韩精品 | 国产成都精品91一区二区三| 日韩中文字幕av电影| 亚洲一区av在线| 一区二区欧美视频| 国产精品免费看片| 国产精品美女一区二区在线观看| 精品久久久久久久久久久久包黑料| 欧美乱妇15p| 欧美日本一区二区在线观看| 欧美亚男人的天堂| 欧美亚洲自拍偷拍| 色综合久久久久综合| 91丨九色丨黑人外教| 91亚洲男人天堂| 91色在线porny| 99精品欧美一区二区蜜桃免费 | 一区二区三区四区在线| 国产精品福利影院| 中文字幕欧美三区| 欧美高清在线视频| 亚洲国产精华液网站w| 日本一区二区三区免费乱视频| 久久久天堂av| 欧美韩国日本一区| 国产精品国产三级国产普通话99 | 亚洲成人av一区| 青青草原综合久久大伊人精品 | 欧美成人video| 26uuu久久天堂性欧美| 久久综合九色综合久久久精品综合 | 欧美性大战xxxxx久久久| 欧美精品久久99| 精品国产123| 久久精品视频一区| 亚洲三级在线免费观看| 亚洲一区二区av电影| 全部av―极品视觉盛宴亚洲| 国产综合色视频| 色综合久久88色综合天天免费| 欧美在线观看视频一区二区三区| 欧美日韩精品一区二区三区四区 | 亚洲视频你懂的| 午夜精品视频一区| 国产一区二区三区久久久 | 成人爱爱电影网址| 欧美日韩国产精品自在自线| 日韩精品一区二区三区在线 | 久久久精品影视| 亚洲婷婷综合色高清在线| 亚洲www啪成人一区二区麻豆 | 91国产福利在线| 日韩美女在线视频| 亚洲欧美成人一区二区三区| 日产精品久久久久久久性色| 粉嫩13p一区二区三区| 欧美在线色视频| 欧美国产成人精品| 奇米影视一区二区三区| 成人黄色免费短视频| 欧美一区二区免费视频| 国产精品色婷婷| 久久国内精品视频| 在线免费精品视频| 欧美极品少妇xxxxⅹ高跟鞋 | 欧美一区二区久久| 亚洲人123区| 国产99久久久久| 亚洲精品一区二区三区福利| 夜夜揉揉日日人人青青一国产精品| 国内精品国产成人国产三级粉色| 欧美亚洲动漫精品|