这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。
整个文件读取
ioutil.ReadFile()
首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。
___ | |_ _ _ _ ilovego.txt | |_ _ _ _ main.go
main.go
package main import ( "fmt" "io/ioutil" "log" ) func main() { content, err := ioutil.ReadFile("ilovego.txt") if err != nil { log.Fatal(err) } fmt.Println(string(content)) }
ReadFile()
ReadFile(filename string) ([]byte, error)os.ReadFile(fileName)
内部 ReadFile 函数实现如下:
func ReadFile(filename string) ([]byte, error) { return os.ReadFile(filename) }
现在,让我们回到我们的程序:
ioutil.ReadFile("readthisfile.txt")log.Fatal()Fatal()Print()os.Exit(1)fmt.Println()contentstring(content)
ilovego.txt
I Love Golang, This is One of the Best Languages on the World!
最后,执行上述代码,可以看到如下输出:
$ go run main.go I Love Golang, This is One of the Best Languages on the World!
按行读取
Split
package main import ( "fmt" // "io/ioutil" "bufio" "log" "os" ) func main() { // opening the file using Open function f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() // create a scanner for the file scanner := bufio.NewScanner(f) // loop through the scanner until it return fasle for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) } }
os.Open()
执行程序,结果如下:
逐个单词读取
我们还可以通过逐个单词来读取文件:
package main import ( "bufio" "fmt" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { fmt.Println(err) } defer f.Close() scanner := bufio.NewScanner(f) scanner.Split(bufio.ScanWords) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println(err) } }
运行代码:
$ go run main.go I Love Golang, This is One of the Best Languages on the World!
以数据块的形式读取文件
一次性读取整个文件似乎是一种简单的方法,但有时我们需要从内存管理的角度使我们的程序得到一些优化。Golang 提供了一种分块读取文件的方法,而不是整个或甚至逐行读取。因为如果一行的大小太大,逐行读取也可能是低效的。
package main import ( "bufio" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 16) for { // reading a file upto buffer n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) } fmt.Println() }
二进制读取
hex
package main import ( "bufio" "encoding/hex" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("sid.jpg") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 256) for { _, err := reader.Read(buf) if err != nil { if err != io.EOF { fmt.Println(err) } break } fmt.Printf("%s", hex.Dump(buf)) } }
总结
ioutil.ReadFile
推荐学习:Golang教程