最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例

 更新時(shí)間:2023年04月03日 10:59:22   作者:C語(yǔ)言中文網(wǎng)  
本文主要介紹了Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

buffer 是緩沖器的意思,Go語(yǔ)言要實(shí)現(xiàn)緩沖讀取需要使用到 bufio 包。bufio 包本身包裝了 io.Reader 和 io.Writer 對(duì)象,同時(shí)創(chuàng)建了另外的 Reader 和 Writer 對(duì)象,因此對(duì)于文本 I/O 來(lái)說(shuō),bufio 包提供了一定的便利性。

buffer 緩沖器的實(shí)現(xiàn)原理就是,將文件讀取進(jìn)緩沖(內(nèi)存)之中,再次讀取的時(shí)候就可以避免文件系統(tǒng)的 I/O 從而提高速度。同理在進(jìn)行寫操作時(shí),先把文件寫入緩沖(內(nèi)存),然后由緩沖寫入文件系統(tǒng)。

使用 bufio 包寫入文件

bufio 和 io 包中有很多操作都是相似的,唯一不同的地方是 bufio 提供了一些緩沖的操作,如果對(duì)文件 I/O 操作比較頻繁的,使用 bufio 包能夠提高一定的性能。

在 bufio 包中,有一個(gè) Writer 結(jié)構(gòu)體,而其相關(guān)的方法支持一些寫入操作,如下所示。

//Writer 是一個(gè)空的結(jié)構(gòu)體,一般需要使用 NewWriter 或者 NewWriterSize 來(lái)初始化一個(gè)結(jié)構(gòu)體對(duì)象
type Writer struct {
        // contains filtered or unexported fields
}
//NewWriterSize 和 NewWriter 函數(shù)
//返回默認(rèn)緩沖大小的 Writer 對(duì)象(默認(rèn)是4096)
func NewWriter(w io.Writer) *Writer
//指定緩沖大小創(chuàng)建一個(gè) Writer 對(duì)象
func NewWriterSize(w io.Writer, size int) *Writer
//Writer 對(duì)象相關(guān)的寫入數(shù)據(jù)的方法
//把 p 中的內(nèi)容寫入 buffer,返回寫入的字節(jié)數(shù)和錯(cuò)誤信息。如果 nn < len(p),返回錯(cuò)誤信息中會(huì)包含為什么寫入的數(shù)據(jù)比較短
func (b *Writer) Write(p []byte) (nn int, err error)
//將 buffer 中的數(shù)據(jù)寫入 io.Writer
func (b *Writer) Flush() error
//以下三個(gè)方法可以直接寫入到文件中
//寫入單個(gè)字節(jié)
func (b *Writer) WriteByte(c byte) error
//寫入單個(gè) Unicode 指針?lè)祷貙懭胱止?jié)數(shù)錯(cuò)誤信息
func (b *Writer) WriteRune(r rune) (size int, err error)
//寫入字符串并返回寫入字節(jié)數(shù)和錯(cuò)誤信息
func (b *Writer) WriteString(s string) (int, error)

示例代碼如下所示:

package main
import (
    "bufio"
    "fmt"
    "os"
)
func main() {
    name := "demo.txt"
    content := "http://jb51.net/golang/"
    fileObj, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
    if err != nil {
        fmt.Println("文件打開失敗", err)
    }
    defer fileObj.Close()
    writeObj := bufio.NewWriterSize(fileObj, 4096)
    //使用 Write 方法,需要使用 Writer 對(duì)象的 Flush 方法將 buffer 中的數(shù)據(jù)刷到磁盤
    buf := []byte(content)
    if _, err := writeObj.Write(buf); err == nil {
        if err := writeObj.Flush(); err != nil {
            panic(err)
        }
        fmt.Println("數(shù)據(jù)寫入成功")
    }
}

運(yùn)行上面的代碼會(huì)在當(dāng)前目錄之下生成 demo.txt 文件,并將“http://jb51.net/golang/”寫入到該文件中。

使用 bufio 包讀取文件

使用 bufio 包讀取文件也非常方便,我們先來(lái)看下 bufio 包的相關(guān)的 Reader 函數(shù)方法:

//首先定義了一個(gè)用來(lái)緩沖 io.Reader 對(duì)象的結(jié)構(gòu)體,同時(shí)該結(jié)構(gòu)體擁有以下相關(guān)的方法
type Reader struct {
}
//NewReader 函數(shù)用來(lái)返回一個(gè)默認(rèn)大小 buffer 的 Reader 對(duì)象(默認(rèn)大小是 4096) 等同于 NewReaderSize(rd,4096)
func NewReader(rd io.Reader) *Reader
//該函數(shù)返回一個(gè)指定大小 buffer(size 最小為 16)的 Reader 對(duì)象,如果 io.Reader 參數(shù)已經(jīng)是一個(gè)足夠大的 Reader,它將返回該 Reader
func NewReaderSize(rd io.Reader, size int) *Reader
//該方法返回從當(dāng)前 buffer 中能被讀到的字節(jié)數(shù)
func (b *Reader) Buffered() int
//Discard 方法跳過(guò)后續(xù)的 n 個(gè)字節(jié)的數(shù)據(jù),返回跳過(guò)的字節(jié)數(shù)。如果 0 <= n <= b.Buffered(),該方法將不會(huì)從 io.Reader 中成功讀取數(shù)據(jù)
func (b *Reader) Discard(n int) (discarded int, err error)
//Peekf 方法返回緩存的一個(gè)切片,該切片只包含緩存中的前 n 個(gè)字節(jié)的數(shù)據(jù)
func (b *Reader) Peek(n int) ([]byte, error)
//把 Reader 緩存對(duì)象中的數(shù)據(jù)讀入到 []byte 類型的 p 中,并返回讀取的字節(jié)數(shù)。讀取成功,err 將返回空值
func (b *Reader) Read(p []byte) (n int, err error)
//返回單個(gè)字節(jié),如果沒(méi)有數(shù)據(jù)返回 err
func (b *Reader) ReadByte() (byte, error)
//該方法在 b 中讀取 delimz 之前的所有數(shù)據(jù),返回的切片是已讀出的數(shù)據(jù)的引用,切片中的數(shù)據(jù)在下一次的讀取操作之前是有效的。如果未找到 delim,將返回查找結(jié)果并返回 nil 空值。因?yàn)榫彺娴臄?shù)據(jù)可能被下一次的讀寫操作修改,因此一般使用 ReadBytes 或者 ReadString,他們返回的都是數(shù)據(jù)拷貝
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
//功能同 ReadSlice,返回?cái)?shù)據(jù)的拷貝
func (b *Reader) ReadBytes(delim byte) ([]byte, error)
//功能同 ReadBytes,返回字符串
func (b *Reader) ReadString(delim byte) (string, error)
//該方法是一個(gè)低水平的讀取方式,一般建議使用 ReadBytes('\n') 或 ReadString('\n'),或者使用一個(gè) Scanner 來(lái)代替。ReadLine 通過(guò)調(diào)用 ReadSlice 方法實(shí)現(xiàn),返回的也是緩存的切片,用于讀取一行數(shù)據(jù),不包括行尾標(biāo)記(\n 或 \r\n)
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
//讀取單個(gè) UTF-8 字符并返回一個(gè) rune 和字節(jié)大小
func (b *Reader) ReadRune() (r rune, size int, err error)

示例代碼如下:

package main
import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)
func main() {
    fileObj, err := os.Open("demo.txt")
    if err != nil {
        fmt.Println("文件打開失?。?, err)
        return
    }
    defer fileObj.Close()
    //一個(gè)文件對(duì)象本身是實(shí)現(xiàn)了io.Reader的 使用bufio.NewReader去初始化一個(gè)Reader對(duì)象,存在buffer中的,讀取一次就會(huì)被清空
    reader := bufio.NewReader(fileObj)
    buf := make([]byte, 1024)
    //讀取 Reader 對(duì)象中的內(nèi)容到 []byte 類型的 buf 中
    info, err := reader.Read(buf)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("讀取的字節(jié)數(shù):" + strconv.Itoa(info))
    //這里的buf是一個(gè)[]byte,因此如果需要只輸出內(nèi)容,仍然需要將文件內(nèi)容的換行符替換掉
    fmt.Println("讀取的文件內(nèi)容:", string(buf))
}

運(yùn)行結(jié)果如下:

go run main.go
讀取的字節(jié)數(shù):30
讀取的文件內(nèi)容: http://jb51.net/golang/

到此這篇關(guān)于Go語(yǔ)言使用buffer讀取文件的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go語(yǔ)言buffer讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬(wàn)次的下單請(qǐng)求

    go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬(wàn)次的下單請(qǐng)求

    這篇文章主要為大家介紹了go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬(wàn)次的下單請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語(yǔ)言調(diào)用SiliconFlow實(shí)現(xiàn)文本轉(zhuǎn)換為MP3格式

    Go語(yǔ)言調(diào)用SiliconFlow實(shí)現(xiàn)文本轉(zhuǎn)換為MP3格式

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何調(diào)用?SiliconFlow?語(yǔ)音生成?API?的腳本,用于將文本轉(zhuǎn)換為?MP3?格式的語(yǔ)音文件,感興趣的小伙伴可以了解下
    2025-02-02
  • GO語(yǔ)言中常見的排序算法使用示例

    GO語(yǔ)言中常見的排序算法使用示例

    這篇文章主要為大家介紹了GO語(yǔ)言中常見排序算法的使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go實(shí)現(xiàn)并發(fā)緩存的示例代碼

    Go實(shí)現(xiàn)并發(fā)緩存的示例代碼

    高并發(fā)數(shù)據(jù)存儲(chǔ)是現(xiàn)代互聯(lián)網(wǎng)應(yīng)用開發(fā)中常遇到的一大挑戰(zhàn),本文主要介紹了Go實(shí)現(xiàn)并發(fā)緩存的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 深入了解Golang包的獲取方法

    深入了解Golang包的獲取方法

    Go語(yǔ)言有一個(gè)獲取遠(yuǎn)程包的工具就是go get,本文將詳細(xì)為大家介紹一下Go語(yǔ)言包的獲取的方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • 為什么GO不支持循環(huán)引用

    為什么GO不支持循環(huán)引用

    這篇文章主要介紹的是為什么GO不支持循環(huán)引用,學(xué)習(xí) Go 語(yǔ)言的開發(fā)者越來(lái)越多了,很多小伙伴在使用時(shí),就會(huì)遇到種種不理解的問(wèn)題,其中一點(diǎn)就是包的循環(huán)引用的報(bào)錯(cuò),下main文章我們一起來(lái)看看學(xué)習(xí)原因
    2021-10-10
  • golang類型轉(zhuǎn)換組件Cast的使用詳解

    golang類型轉(zhuǎn)換組件Cast的使用詳解

    這篇文章主要介紹了golang類型轉(zhuǎn)換組件Cast的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用golang,感興趣的朋友可以了解下
    2021-02-02
  • golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    viper 配置管理解析庫(kù),是由大神 Steve Francia 開發(fā),他在google領(lǐng)導(dǎo)著 golang 的產(chǎn)品開發(fā),他也是 gohugo.io 的創(chuàng)始人之一,命令行解析庫(kù) cobra 開發(fā)者,這篇文章主要介紹了golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解,需要的朋友可以參考下
    2020-10-10
  • golang復(fù)制文件夾移動(dòng)到另一個(gè)文件夾實(shí)現(xiàn)方法詳解

    golang復(fù)制文件夾移動(dòng)到另一個(gè)文件夾實(shí)現(xiàn)方法詳解

    這篇文章主要為大家介紹了golang復(fù)制文件夾并移動(dòng)到另一個(gè)文件夾實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Golang標(biāo)準(zhǔn)庫(kù)之errors包應(yīng)用方式

    Golang標(biāo)準(zhǔn)庫(kù)之errors包應(yīng)用方式

    Go語(yǔ)言的errors包提供了基礎(chǔ)的錯(cuò)誤處理能力,允許通過(guò)errors.New創(chuàng)建自定義error對(duì)象,error在Go中是一個(gè)接口,通過(guò)實(shí)現(xiàn)Error方法來(lái)定義錯(cuò)誤文本,對(duì)錯(cuò)誤的比較通?;趯?duì)象地址,而非文本內(nèi)容,因此即使兩個(gè)錯(cuò)誤文本相同
    2024-10-10

最新評(píng)論

通海县| 南投市| 陕西省| 灵寿县| 鞍山市| 会宁县| 扎赉特旗| 长沙县| 云梦县| 名山县| 攀枝花市| 宁化县| 山阴县| 宜宾市| 巴彦县| 黄平县| 涿州市| 楚雄市| 刚察县| 阳原县| 昌黎县| 古田县| 永和县| 新田县| 阿荣旗| 拉萨市| 齐河县| 岑巩县| 崇州市| 黑河市| 洞头县| 丹阳市| 沭阳县| 和田县| 永安市| 高邮市| 南投市| 鄱阳县| 含山县| 于都县| 揭东县|