一文帶你掌握Go語言中的文件讀取操作
os 包 和 bufio 包
Go 標(biāo)準(zhǔn)庫的 os 包,為我們提供很多操作文件的函數(shù),如 Open(name) 打開文件、Create(name) 創(chuàng)建文件等函數(shù),與之對(duì)應(yīng)的是 bufio 包,os 包是直接對(duì)磁盤進(jìn)行操作的,而 bufio 包則是帶有緩沖的操作,不用每次都去操作磁盤。
os.Open 與 os.OpenFile 以及 File.Read
Open(name string) (*File, error)
通過 文件名 或 文件路徑+文件名 的形式打開一個(gè)文件,此文件只能用于讀操作,如果文件不存在則返回 PathError 。
- 參數(shù)
name為文件名或文件路徑+文件名。 - 返回值
*File為一個(gè)File結(jié)構(gòu)體的指針類型,通過指針可以對(duì)文件進(jìn)行讀寫等操作。 - 返回值
error為打開文件的過程中產(chǎn)生的錯(cuò)誤。
OpenFile(name string, flag int, perm FileMode) (*File, error)
通過指定 文件名 或 文件路徑+文件名、文件操作模式、文件權(quán)限三個(gè)參數(shù)打開一個(gè)文件,之后可對(duì)此文件進(jìn)行讀寫操作。
- 參數(shù)
name為文件名或文件路徑+文件名。 - 參數(shù)
flag為指定文件操作模式,可選值有O_RDONLY→ 只讀操作、O_WRONLY→ 只寫操作、O_RDWR→ 讀寫操作、O_APPEND→ 寫入時(shí)向文件追加數(shù)據(jù)、O_CREATE→ 如果不存在,則創(chuàng)建一個(gè)新文件等。 - 參數(shù)
perm參數(shù)表示文件的模式和權(quán)限,例如0666為讀寫權(quán)限。如果對(duì)文件權(quán)限所對(duì)應(yīng)的數(shù)字不了解,可以去學(xué)習(xí)一下。 - 返回值
*File為一個(gè)File結(jié)構(gòu)體的指針類型,通過指針可以對(duì)文件進(jìn)行讀寫等操作。 - 返回值
error為打開文件的過程中產(chǎn)生的錯(cuò)誤。
File.Read(b []byte) (n int, err error)
讀取與 b 等長度的字節(jié),并存儲(chǔ)到 b 里面。
- 參數(shù)
b為一個(gè)切片數(shù)組,用于指定讀取長度和存儲(chǔ)字節(jié)數(shù)據(jù)。 - 返回值
n為所讀取字節(jié)的長度。 - 返回值
error為讀取字節(jié)的過程中產(chǎn)生的錯(cuò)誤。
讀取文件操作
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("字符串?dāng)?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]
字符串?dāng)?shù)據(jù): Hello world
所獲取字節(jié)的長度: 11
- 首先通過
Open函數(shù)打開1.txt文件,用file變量接收,默認(rèn)為可讀模式; - 然后創(chuàng)建一個(gè)長度為
11的字節(jié)切片,接著通過file變量的方法Read讀取長度為11的字節(jié)數(shù)據(jù)。os.Open("1.txt")等價(jià)于os.OpenFile("1.txt", os.O_RDONLY, 0)。 - 最后打印讀取到的數(shù)據(jù)。
bufio.NewReader 和 Reader.ReadString
讀取文件,建議使用 bufio.NewReader 和 Reader.ReadString,減少磁盤的操作。
NewReader(rd io.Reader) *Reader 獲取一個(gè)有緩沖區(qū)的 Reader 指針變量,緩沖區(qū)默認(rèn)大小為 4096 字節(jié)。通過變量可以對(duì)數(shù)據(jù)進(jìn)行讀操作。
- 參數(shù)
rd為一個(gè)接口,實(shí)現(xiàn)這個(gè)接口的數(shù)據(jù)類型變量都可以作為參數(shù),例如上面提到的File。 - 返回值
*Reader為Reader結(jié)構(gòu)體的指針,通過指針可以讀取緩沖區(qū)的數(shù)據(jù)。
ReadString(delim byte) (string, error) 讀取數(shù)據(jù),直到第一次遇到分隔符 delim 為止。讀取過程中發(fā)生錯(cuò)誤會(huì)返回 EOF 錯(cuò)誤信息。
- 參數(shù)
delim為分隔符,每次讀取時(shí)遇到分隔符就會(huì)終止。 - 第一個(gè)返回值為所讀取的內(nèi)容,內(nèi)容包括分隔符。
- 第二個(gè)返回值為讀取過程中產(chǎn)生的錯(cuò)誤信息。
讀取文件操作
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 {
// 因?yàn)槭且該Q行符為分隔符,如果最后一行沒有換行符,那么返回 io.EOF 錯(cuò)誤時(shí),也是可能讀到數(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)建一個(gè)緩沖區(qū),將默認(rèn)長度的字節(jié)讀取到緩沖區(qū)中; - 接著通過
Reader結(jié)構(gòu)體的方法ReadString,以\n為分隔符,按行讀取數(shù)據(jù),然后打印數(shù)據(jù)。 - 其中有一個(gè)注意點(diǎn)就是,因?yàn)槭且該Q行符為分隔符,如果最后一行沒有換行符,那么返回
io.EOF錯(cuò)誤時(shí),也是可能讀到數(shù)據(jù)的,因此需要判斷一下是否讀到了數(shù)據(jù)。
小結(jié)
本文先是對(duì) os 包 和 bufio 包進(jìn)行簡單的介紹,然后介紹 os 包里的 Open 和 OpenFile 函數(shù)以及 File 結(jié)構(gòu)體的方法 Read,通過案例展示它們的使用方式。緊接著引出 bufio 包里的 NewReader 函數(shù)和 Reader 結(jié)構(gòu)體的方法 ReadString,讀取文件的操作推薦使用它們,能減少對(duì)磁盤的操作,高效讀取數(shù)據(jù)。
到此這篇關(guān)于一文帶你掌握Go語言中的文件讀取操作的文章就介紹到這了,更多相關(guān)Go語言文件讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你了解Golang中強(qiáng)大的重試機(jī)制
在 Go 語言中,處理瞬態(tài)錯(cuò)誤是常見的挑戰(zhàn),這些錯(cuò)誤可能會(huì)在一段時(shí)間后自動(dòng)恢復(fù),因此,重試機(jī)制在這些情況下非常重要,所以本文就來和大家聊聊Golang中強(qiáng)大的重試機(jī)制吧2025-01-01
使用goland調(diào)試遠(yuǎn)程代碼的操作步驟
大家都知道如何在goland調(diào)試遠(yuǎn)程代碼嗎?今天小編給大家分享一篇教程幫助大家學(xué)習(xí)goland調(diào)試遠(yuǎn)程代碼的操作步驟,感興趣的朋友跟隨小編一起看看吧2021-06-06
golang?gorm模型結(jié)構(gòu)體的定義示例
這篇文章主要為大家介紹了golang?gorm模型結(jié)構(gòu)體的定義示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
基于Go語言構(gòu)建RESTful API服務(wù)
在實(shí)際開發(fā)項(xiàng)目中,你編寫的服務(wù)可以被其他服務(wù)使用,這樣就組成了微服務(wù)的架構(gòu);也可以被前端調(diào)用,這樣就可以前后端分離。那么,本文主要介紹什么是 RESTful API,以及 Go 語言是如何玩轉(zhuǎn) RESTful API 的2021-07-07
Golang干貨分享之利用AST實(shí)現(xiàn)AOP功能
本文主要是一個(gè)純干貨分享,主要介紹了Golang如何利用AST實(shí)現(xiàn)AOP功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04

