首頁 > 軟體

一文搞懂Go語言中檔案的讀寫與建立

2022-07-04 18:00:26

1. 檔案的開啟與關閉

1.1 os.open

os.open 函數能開啟一個檔案 呼叫 close() 方法 關閉檔案

	//開啟檔案
	open, err := os.Open("./1.text")
	
	if err != nil {
		//列印異常資訊
		fmt.Println("open file err", err)
	}

	fmt.Println("檔案獲取完畢")

	//沒有出現異常,關閉檔案
	open.Close()

為了防止忘記關閉檔案,通常都將關閉檔案的程式碼寫在 defer中

	//開啟檔案
	open, err := os.Open("./1.text")

	defer func() {
		if open != nil {
			// 關閉檔案
			open.Close()
		}
	}()

	if err != nil {
		//列印異常資訊
		fmt.Println("open file err", err)
	}

	fmt.Println("檔案獲取完畢")

1.2 os.OpenFile() 指定模式開啟檔案

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    ...
}

其中:

name:要開啟的檔名 flag:開啟檔案的模式。 模式有以下幾種:

模式含義
os.O_WRONLY只寫
os.O_CREATE建立檔案
os.O_RDONLY唯讀
os.O_RDWR讀寫
os.O_TRUNC清空
os.O_APPEND追加

perm:檔案許可權,一個八進位制數。r(讀)04,w(寫)02,x(執行)01。

2. 檔案的讀取

2.1 開啟檔案的方式讀取檔案中的資料

//首先需要開啟一個檔案
	open, err := os.Open("./1.text")
	defer func() {
		e := recover()
		if e != nil {

			fmt.Println("開啟檔案出現了異常", e)
		}
	}()

	if err != nil {
		// 如果有異常  沒必要往下走了  丟擲
		panic(err)
	}

	//如果沒有異常
	//建立 位元組切片
	bytes := make([]byte, 1024)

	defer func() {
		e := recover()
		if e != nil {

			fmt.Println("讀取檔案出現了異常", e)
		}
	}()

	for {
		//迴圈讀
		_, err := open.Read(bytes)

		if err != nil {
			panic(err)
		}

		//列印結果
		fmt.Println(string(bytes))
	}

2.2 使用 bufio 整行讀取檔案

bufio 是在file的基礎上封裝了一層API , 支援更多的功能

	//同樣的首先開啟一個檔案
	file, err := os.Open("./1.text")

	defer recover()

	if err != nil {
		panic("檔案開啟出現異常")
	}

	// 封裝為 bufio
	reader := bufio.NewReader(file)

	defer recover()

	for {

		//讀到指定字串換一行
		line, _, err := reader.ReadLine()

		if err != nil {
			if err == io.EOF {
				fmt.Println("檔案讀寫完畢")
				break
			}
			panic("檔案讀取出現異常")
		}

		fmt.Println(string(line))
	}

	fmt.Println("程式執行結束")
func main() {
	file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
}

3. 寫入檔案操作

無論是檔案讀取還是檔案寫入 都是需要先開啟檔案 再進行操作

3.1 file.Write 與 file.WriteString

// 首先開啟檔案  O_RDWR  讀寫許可權  O_TRUNC  清空檔案  0 開頭表示八進位制 666表示 當用使用者 當前組  其他使用者 都是可讀可寫許可權
	file, err := os.OpenFile("1.text", os.O_RDWR|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Printf("開啟檔案出現異常 %v", err)
	}

	defer file.Close()

	// 返回 寫入的位元組數
	write, err := file.Write([]byte("測試檔案寫入 n"))
	file.WriteString("一次寫入整個字串")

	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(write)

3.2 bufio.NewWriter

// 基於快取操作
	file, err := os.OpenFile("2.text", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
	if err != nil {
		panic(err)
	}

	defer func() {
		file.Close()
		if e := recover(); e != nil {
			fmt.Printf("異常 : 開啟檔案出現異常 %v", e)
		}
	}()

	// 使用 bufio 基於快取操作io流
	// 需要傳入 一個 io 介面包下的 Writer 介面實現類 而 file 實現了該 方法

	writer := bufio.NewWriter(file)

	writer.WriteString(" 寫入快取字串內容 2")

	//需要將快取中的資料重新整理到硬碟上
	writer.Flush()

3.3 ioUtil 工具類

	// 使用工具類  開啟檔案,寫入檔案一氣呵成
	err := ioutil.WriteFile("3.text", []byte("工具類寫入內容"), 0666)

	if err != nil {
		fmt.Println("程式執行出現異常", err)
	}

到此這篇關於一文搞懂Go語言中檔案的讀寫與建立的文章就介紹到這了,更多相關Go語言 檔案讀寫 建立內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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