概念簡介
讀寫文件在很多程序中都是必須的基本任務。在這裏我們看看一些Go語言讀文件的例子。
例程代碼
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
// 讀取文件需要經常進行錯誤檢查,這個幫助方法可以精簡下麵
// 的錯誤檢查過程。
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// 也許大部分基本的文件讀取任務是將文件內容讀取到
// 內存中。
dat, err := ioutil.ReadFile("/tmp/dat")
check(err)
fmt.Print(string(dat))
// 你經常會想對於一個文件是怎麽讀並且讀取到哪一部分
// 進行更多的控製。對於這個任務,從使用 `os.Open`
// 打開一個文件獲取一個 `os.File` 值開始。
f, err := os.Open("/tmp/dat")
check(err)
// 從文件開始位置讀取一些字節。這裏最多讀取 5 個字
// 節,並且這也是我們實際讀取的字節數。
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))
// 你也可以 `Seek` 到一個文件中已知的位置並從這個位置開
// 始進行讀取。
o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
// `io` 包提供了一些可以幫助我們進行文件讀取的函數。
// 例如,上麵的讀取可以使用 `ReadAtLeast` 得到一個更
// 健壯的實現。
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
// 沒有內置的回轉支持,但是使用 `Seek(0, 0)` 實現。
_, err = f.Seek(0, 0)
check(err)
// `bufio` 包實現了帶緩衝的讀取,這不僅對於很多小的讀
// 取操作能夠提升性能,也提供了很多附加的讀取函數。
r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
fmt.Printf("5 bytes: %s\n", string(b4))
// 任務結束後要關閉這個文件(通常這個操作應該在 `Open`
// 操作後立即使用 `defer` 來完成)。
f.Close()
}
執行&輸出
$ echo "hello" > /tmp/dat
$ echo "go" >> /tmp/dat
$ go run reading-files.go
hello
go
5 bytes: hello
2 bytes @ 6: go
2 bytes @ 6: go
5 bytes: hello
# 下麵我們將看一下寫入文件。
課程導航
學習上一篇:Go語言教程:Base64編碼 學習下一篇:Go語言教程:寫文件
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/reading-files