一文帶你掌握Go語言中的文件讀取操作
os 包 和 bufio 包
Go 標準庫的 os
包,為我們提供很多操作文件的函數(shù),如 Open(name)
打開文件、Create(name)
創(chuàng)建文件等函數(shù),與之對應(yīng)的是 bufio
包,os
包是直接對磁盤進行操作的,而 bufio
包則是帶有緩沖的操作,不用每次都去操作磁盤。
os.Open 與 os.OpenFile 以及 File.Read
Open(name string) (*File, error)
通過 文件名 或 文件路徑+文件名 的形式打開一個文件,此文件只能用于讀操作,如果文件不存在則返回 PathError
。
- 參數(shù)
name
為文件名或文件路徑+文件名。 - 返回值
*File
為一個File
結(jié)構(gòu)體的指針類型,通過指針可以對文件進行讀寫等操作。 - 返回值
error
為打開文件的過程中產(chǎn)生的錯誤。
OpenFile(name string, flag int, perm FileMode) (*File, error)
通過指定 文件名 或 文件路徑+文件名、文件操作模式、文件權(quán)限三個參數(shù)打開一個文件,之后可對此文件進行讀寫操作。
- 參數(shù)
name
為文件名或文件路徑+文件名。 - 參數(shù)
flag
為指定文件操作模式,可選值有O_RDONLY
→ 只讀操作、O_WRONLY
→ 只寫操作、O_RDWR
→ 讀寫操作、O_APPEND
→ 寫入時向文件追加數(shù)據(jù)、O_CREATE
→ 如果不存在,則創(chuàng)建一個新文件等。 - 參數(shù)
perm
參數(shù)表示文件的模式和權(quán)限,例如0666
為讀寫權(quán)限。如果對文件權(quán)限所對應(yīng)的數(shù)字不了解,可以去學習一下。 - 返回值
*File
為一個File
結(jié)構(gòu)體的指針類型,通過指針可以對文件進行讀寫等操作。 - 返回值
error
為打開文件的過程中產(chǎn)生的錯誤。
File.Read(b []byte) (n int, err error)
讀取與 b
等長度的字節(jié),并存儲到 b
里面。
- 參數(shù)
b
為一個切片數(shù)組,用于指定讀取長度和存儲字節(jié)數(shù)據(jù)。 - 返回值
n
為所讀取字節(jié)的長度。 - 返回值
error
為讀取字節(jié)的過程中產(chǎn)生的錯誤。
讀取文件操作
import ( "fmt" "os" ) func main() { file, err := os.Open("1.txt") if err != nil { fmt.Println(err) return } defer file.Close() data := make([]byte, 11) count, err := file.Read(data) if err != nil { return } fmt.Println("字節(jié)數(shù)據(jù):", data) // [72 101 108 108 111 32 119 111 114 108 100] fmt.Println("字符串數(shù)據(jù):", string(data)) // Hello world fmt.Println("所獲取字節(jié)的長度:", count) // 11 }
執(zhí)行結(jié)果:
字節(jié)數(shù)據(jù): [72 101 108 108 111 32 119 111 114 108 100]
字符串數(shù)據(jù): Hello world
所獲取字節(jié)的長度: 11
- 首先通過
Open
函數(shù)打開1.txt
文件,用file
變量接收,默認為可讀模式; - 然后創(chuàng)建一個長度為
11
的字節(jié)切片,接著通過file
變量的方法Read
讀取長度為11
的字節(jié)數(shù)據(jù)。os.Open("1.txt")
等價于os.OpenFile("1.txt", os.O_RDONLY, 0)
。 - 最后打印讀取到的數(shù)據(jù)。
bufio.NewReader 和 Reader.ReadString
讀取文件,建議使用 bufio.NewReader
和 Reader.ReadString
,減少磁盤的操作。
NewReader(rd io.Reader) *Reader
獲取一個有緩沖區(qū)的 Reader
指針變量,緩沖區(qū)默認大小為 4096
字節(jié)。通過變量可以對數(shù)據(jù)進行讀操作。
- 參數(shù)
rd
為一個接口,實現(xiàn)這個接口的數(shù)據(jù)類型變量都可以作為參數(shù),例如上面提到的File
。 - 返回值
*Reader
為Reader
結(jié)構(gòu)體的指針,通過指針可以讀取緩沖區(qū)的數(shù)據(jù)。
ReadString(delim byte) (string, error)
讀取數(shù)據(jù),直到第一次遇到分隔符 delim
為止。讀取過程中發(fā)生錯誤會返回 EOF
錯誤信息。
- 參數(shù)
delim
為分隔符,每次讀取時遇到分隔符就會終止。 - 第一個返回值為所讀取的內(nèi)容,內(nèi)容包括分隔符。
- 第二個返回值為讀取過程中產(chǎn)生的錯誤信息。
讀取文件操作
1.txt 文件的內(nèi)容為:
Hello world Hello Golang Hello Gopher
import ( "bufio" "fmt" "io" "os" "strings" ) func main() { file, err := os.OpenFile("1.txt", os.O_RDONLY, 0) if err != nil { fmt.Println(err) return } defer file.Close() reader := bufio.NewReader(file) for { if lineData, err := reader.ReadString('\n'); err != nil { if err == io.EOF { // 因為是以換行符為分隔符,如果最后一行沒有換行符,那么返回 io.EOF 錯誤時,也是可能讀到數(shù)據(jù)的,因此判斷一下是否讀到了數(shù)據(jù) if len(lineData) > 0 { fmt.Println(lineData) } break } } else { fmt.Println(strings.TrimRight(lineData, "\n")) } } }
執(zhí)行結(jié)果:
Hello World
Hello Golang
Hello Gopher
- 首先通過
OpenFile
函數(shù)打開1.txt
文件,用file
變量接收,指定為可讀模式; - 然后通過
NewReader
函數(shù)創(chuàng)建一個緩沖區(qū),將默認長度的字節(jié)讀取到緩沖區(qū)中; - 接著通過
Reader
結(jié)構(gòu)體的方法ReadString
,以\n
為分隔符,按行讀取數(shù)據(jù),然后打印數(shù)據(jù)。 - 其中有一個注意點就是,因為是以換行符為分隔符,如果最后一行沒有換行符,那么返回
io.EOF
錯誤時,也是可能讀到數(shù)據(jù)的,因此需要判斷一下是否讀到了數(shù)據(jù)。
小結(jié)
本文先是對 os
包 和 bufio
包進行簡單的介紹,然后介紹 os
包里的 Open
和 OpenFile
函數(shù)以及 File
結(jié)構(gòu)體的方法 Read
,通過案例展示它們的使用方式。緊接著引出 bufio
包里的 NewReader
函數(shù)和 Reader
結(jié)構(gòu)體的方法 ReadString
,讀取文件的操作推薦使用它們,能減少對磁盤的操作,高效讀取數(shù)據(jù)。
到此這篇關(guān)于一文帶你掌握Go語言中的文件讀取操作的文章就介紹到這了,更多相關(guān)Go語言文件讀取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Golang快速構(gòu)建出命令行應(yīng)用程序
在日常開發(fā)中,大家對命令行工具(CLI)想必特別熟悉了,如果說你不知道命令工具,那你可能是個假開發(fā)。每天都會使用大量的命令行工具,例如最常用的Git、Go、Docker等,這篇文章主要介紹了使用Golang快速構(gòu)建出命令行應(yīng)用程序,需要的朋友可以參考下2023-02-02