首頁 > 軟體

一文帶你掌握Go語言中的檔案讀取操作

2022-12-07 14:00:49

os 包 和 bufio 包

Go 標準庫的 os 包,為我們提供很多操作檔案的函數,如 Open(name) 開啟檔案、Create(name) 建立檔案等函數,與之對應的是 bufio 包,os 包是直接對磁碟進行操作的,而 bufio 包則是帶有緩衝的操作,不用每次都去操作磁碟。

os.Open 與 os.OpenFile 以及 File.Read

Open(name string) (*File, error)

通過 檔名檔案路徑+檔名 的形式開啟一個檔案,此檔案只能用於讀操作,如果檔案不存在則返回 PathError

  • 引數 name檔名檔案路徑+檔名
  • 返回值 *File 為一個 File 結構體的指標型別,通過指標可以對檔案進行讀寫等操作。
  • 返回值 error 為開啟檔案的過程中產生的錯誤。

OpenFile(name string, flag int, perm FileMode) (*File, error)

通過指定 檔名檔案路徑+檔名、檔案操作模式、檔案許可權三個引數開啟一個檔案,之後可對此檔案進行讀寫操作。

  • 引數 name檔名檔案路徑+檔名
  • 引數 flag 為指定檔案操作模式,可選值有 O_RDONLY → 唯讀操作、O_WRONLY → 只寫操作、O_RDWR → 讀寫操作、O_APPEND → 寫入時向檔案追加資料、O_CREATE → 如果不存在,則建立一個新檔案等。
  • 引數 perm 參數列示檔案的模式和許可權,例如 0666 為讀寫許可權。如果對檔案許可權所對應的數位不瞭解,可以去學習一下。
  • 返回值 *File 為一個 File 結構體的指標型別,通過指標可以對檔案進行讀寫等操作。
  • 返回值 error 為開啟檔案的過程中產生的錯誤。

File.Read(b []byte) (n int, err error)

讀取與 b 等長度的位元組,並儲存到 b 裡面。

  • 引數 b 為一個切片陣列,用於指定讀取長度和儲存位元組資料。
  • 返回值 n 為所讀取位元組的長度。
  • 返回值 error 為讀取位元組的過程中產生的錯誤。

讀取檔案操作

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("位元組資料:", data)          // [72 101 108 108 111 32 119 111 114 108 100]
	fmt.Println("字串資料:", string(data)) // Hello world
	fmt.Println("所獲取位元組的長度:", count)     // 11
}

執行結果:

位元組資料: [72 101 108 108 111 32 119 111 114 108 100]
字串資料: Hello world
所獲取位元組的長度: 11

  • 首先通過 Open 函數開啟 1.txt 檔案,用 file 變數接收,預設為可讀模式;
  • 然後建立一個長度為 11 的位元組切片,接著通過 file 變數的方法 Read 讀取長度為 11 的位元組資料。os.Open("1.txt") 等價於 os.OpenFile("1.txt", os.O_RDONLY, 0)
  • 最後列印讀取到的資料。

bufio.NewReader 和 Reader.ReadString

讀取檔案,建議使用 bufio.NewReaderReader.ReadString,減少磁碟的操作。

NewReader(rd io.Reader) *Reader 獲取一個有緩衝區的 Reader 指標變數,緩衝區預設大小為 4096 位元組。通過變數可以對資料進行讀操作。

  • 引數 rd 為一個介面,實現這個介面的資料型別變數都可以作為引數,例如上面提到的 File
  • 返回值 *ReaderReader 結構體的指標,通過指標可以讀取緩衝區的資料。

ReadString(delim byte) (string, error) 讀取資料,直到第一次遇到分隔符 delim 為止。讀取過程中發生錯誤會返回 EOF 錯誤資訊。

  • 引數 delim 為分隔符,每次讀取時遇到分隔符就會終止。
  • 第一個返回值為所讀取的內容,內容包括分隔符。
  • 第二個返回值為讀取過程中產生的錯誤資訊。

讀取檔案操作

1.txt 檔案的內容為:

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 錯誤時,也是可能讀到資料的,因此判斷一下是否讀到了資料
				if len(lineData) > 0 {
					fmt.Println(lineData)
				}
				break
			}
		} else {
			fmt.Println(strings.TrimRight(lineData, "n"))
		}
	}
}

執行結果:

Hello World
Hello Golang
Hello Gopher

  • 首先通過 OpenFile 函數開啟 1.txt 檔案,用 file 變數接收,指定為可讀模式;
  • 然後通過 NewReader 函數建立一個緩衝區,將預設長度的位元組讀取到緩衝區中;
  • 接著通過 Reader 結構體的方法 ReadString,以 n 為分隔符,按行讀取資料,然後列印資料。
  • 其中有一個注意點就是,因為是以換行符為分隔符,如果最後一行沒有換行符,那麼返回 io.EOF 錯誤時,也是可能讀到資料的,因此需要判斷一下是否讀到了資料。

小結

本文先是對 os 包 和 bufio 包進行簡單的介紹,然後介紹 os 包裡的 OpenOpenFile 函數以及 File 結構體的方法 Read,通過案例展示它們的使用方式。緊接著引出 bufio 包裡的 NewReader 函數和 Reader 結構體的方法 ReadString,讀取檔案的操作推薦使用它們,能減少對磁碟的操作,高效讀取資料。

到此這篇關於一文帶你掌握Go語言中的檔案讀取操作的文章就介紹到這了,更多相關Go語言檔案讀取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com