亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

使用 bufio 包寫入文件

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

在 bufio 包中,有一個 Writer 結構體,而其相關的方法支持一些寫入操作,如下所示。

//Writer 是一個空的結構體,一般需要使用 NewWriter 或者 NewWriterSize 來初始化一個結構體對象
type Writer struct {
        // contains filtered or unexported fields
}
//NewWriterSize 和 NewWriter 函數(shù)
//返回默認緩沖大小的 Writer 對象(默認是4096)
func NewWriter(w io.Writer) *Writer
//指定緩沖大小創(chuàng)建一個 Writer 對象
func NewWriterSize(w io.Writer, size int) *Writer
//Writer 對象相關的寫入數(shù)據(jù)的方法
//把 p 中的內容寫入 buffer,返回寫入的字節(jié)數(shù)和錯誤信息。如果 nn < len(p),返回錯誤信息中會包含為什么寫入的數(shù)據(jù)比較短
func (b *Writer) Write(p []byte) (nn int, err error)
//將 buffer 中的數(shù)據(jù)寫入 io.Writer
func (b *Writer) Flush() error
//以下三個方法可以直接寫入到文件中
//寫入單個字節(jié)
func (b *Writer) WriteByte(c byte) error
//寫入單個 Unicode 指針返回寫入字節(jié)數(shù)錯誤信息
func (b *Writer) WriteRune(r rune) (size int, err error)
//寫入字符串并返回寫入字節(jié)數(shù)和錯誤信息
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 對象的 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ù)寫入成功")
    }
}

運行上面的代碼會在當前目錄之下生成 demo.txt 文件,并將“http://jb51.net/golang/”寫入到該文件中。

使用 bufio 包讀取文件

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

//首先定義了一個用來緩沖 io.Reader 對象的結構體,同時該結構體擁有以下相關的方法
type Reader struct {
}
//NewReader 函數(shù)用來返回一個默認大小 buffer 的 Reader 對象(默認大小是 4096) 等同于 NewReaderSize(rd,4096)
func NewReader(rd io.Reader) *Reader
//該函數(shù)返回一個指定大小 buffer(size 最小為 16)的 Reader 對象,如果 io.Reader 參數(shù)已經是一個足夠大的 Reader,它將返回該 Reader
func NewReaderSize(rd io.Reader, size int) *Reader
//該方法返回從當前 buffer 中能被讀到的字節(jié)數(shù)
func (b *Reader) Buffered() int
//Discard 方法跳過后續(xù)的 n 個字節(jié)的數(shù)據(jù),返回跳過的字節(jié)數(shù)。如果 0 <= n <= b.Buffered(),該方法將不會從 io.Reader 中成功讀取數(shù)據(jù)
func (b *Reader) Discard(n int) (discarded int, err error)
//Peekf 方法返回緩存的一個切片,該切片只包含緩存中的前 n 個字節(jié)的數(shù)據(jù)
func (b *Reader) Peek(n int) ([]byte, error)
//把 Reader 緩存對象中的數(shù)據(jù)讀入到 []byte 類型的 p 中,并返回讀取的字節(jié)數(shù)。讀取成功,err 將返回空值
func (b *Reader) Read(p []byte) (n int, err error)
//返回單個字節(jié),如果沒有數(shù)據(jù)返回 err
func (b *Reader) ReadByte() (byte, error)
//該方法在 b 中讀取 delimz 之前的所有數(shù)據(jù),返回的切片是已讀出的數(shù)據(jù)的引用,切片中的數(shù)據(jù)在下一次的讀取操作之前是有效的。如果未找到 delim,將返回查找結果并返回 nil 空值。因為緩存的數(shù)據(jù)可能被下一次的讀寫操作修改,因此一般使用 ReadBytes 或者 ReadString,他們返回的都是數(shù)據(jù)拷貝
func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
//功能同 ReadSlice,返回數(shù)據(jù)的拷貝
func (b *Reader) ReadBytes(delim byte) ([]byte, error)
//功能同 ReadBytes,返回字符串
func (b *Reader) ReadString(delim byte) (string, error)
//該方法是一個低水平的讀取方式,一般建議使用 ReadBytes('\n') 或 ReadString('\n'),或者使用一個 Scanner 來代替。ReadLine 通過調用 ReadSlice 方法實現(xiàn),返回的也是緩存的切片,用于讀取一行數(shù)據(jù),不包括行尾標記(\n 或 \r\n)
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
//讀取單個 UTF-8 字符并返回一個 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()
    //一個文件對象本身是實現(xiàn)了io.Reader的 使用bufio.NewReader去初始化一個Reader對象,存在buffer中的,讀取一次就會被清空
    reader := bufio.NewReader(fileObj)
    buf := make([]byte, 1024)
    //讀取 Reader 對象中的內容到 []byte 類型的 buf 中
    info, err := reader.Read(buf)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("讀取的字節(jié)數(shù):" + strconv.Itoa(info))
    //這里的buf是一個[]byte,因此如果需要只輸出內容,仍然需要將文件內容的換行符替換掉
    fmt.Println("讀取的文件內容:", string(buf))
}

運行結果如下:

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

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

相關文章

  • go實現(xiàn)服務優(yōu)雅關閉的示例

    go實現(xiàn)服務優(yōu)雅關閉的示例

    本文主要介紹了go實現(xiàn)服務優(yōu)雅關閉的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • K8s部署發(fā)布Golang應用程序的實現(xiàn)方法

    K8s部署發(fā)布Golang應用程序的實現(xiàn)方法

    本文主要介紹了K8s部署發(fā)布Golang應用程序的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • 一文詳解Golang的中間件設計模式

    一文詳解Golang的中間件設計模式

    最近在看一些rpc框架的使用原理和源碼的時候,對中間件的實現(xiàn)非常感興趣,所以這篇文章就來和大家聊聊Golang的中間件設計模式,希望對大家有所幫助
    2023-03-03
  • 關于go-micro與其它gRPC框架之間的通信問題及解決方法

    關于go-micro與其它gRPC框架之間的通信問題及解決方法

    在之前的文章中分別介紹了使用gRPC官方插件和go-micro插件開發(fā)gRPC應用程序的方式,都能正常走通。不過當兩者混合使用的時候,互相訪問就成了問題,下面通過本文給大家講解下go-micro與gRPC框架通信問題,一起看看吧
    2022-04-04
  • 一文帶你了解Go中跟蹤函數(shù)調用鏈的實現(xiàn)

    一文帶你了解Go中跟蹤函數(shù)調用鏈的實現(xiàn)

    這篇文章主要為大家詳細介紹了go如何實現(xiàn)一個自動注入跟蹤代碼,并輸出有層次感的函數(shù)調用鏈跟蹤命令行工具,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    這篇文章主要介紹了聊聊golang的defer的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • golang-切片slice的創(chuàng)建方式

    golang-切片slice的創(chuàng)建方式

    這篇文章主要介紹了golang-切片slice的創(chuàng)建方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go語言限制協(xié)程并發(fā)數(shù)的方案詳情

    go語言限制協(xié)程并發(fā)數(shù)的方案詳情

    一個線程中可以有任意多個協(xié)程,但某一時刻只能有一個協(xié)程在運行,多個協(xié)程分享該線程分配到的計算機資源,接下來通過本文給大家介紹go語言限制協(xié)程的并發(fā)數(shù)的方案詳情,感興趣的朋友一起看看吧
    2022-01-01
  • 基于Go語言實現(xiàn)分金幣游戲

    基于Go語言實現(xiàn)分金幣游戲

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)分金幣游戲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go設計模式之狀態(tài)模式圖文詳解

    Go設計模式之狀態(tài)模式圖文詳解

    狀態(tài)模式是一種行為設計模式, 讓你能在一個對象的內部狀態(tài)變化時改變其行為, 使其看上去就像改變了自身所屬的類一樣,本文將通過一些圖片來給大家詳細的介紹一下Go的狀態(tài)模式,需要的朋友可以參考下
    2023-08-08

最新評論