Goreadfile教程展示了如何在Golang中读取文件。我们读取文本和二进制文件。在Go写入文件中了解如何在Go中写入文件。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
要在Go中读取文件,我们使用os
、ioutil
、io
和bufio
包。
The Battle of Thermopylae was fought between an alliance of Greek city-states, led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the course of three days, during the second Persian invasion of Greece.
我们在一些例子中使用这个文本文件。
将文件读入字符串
ioutil.ReafFile
函数将整个文件读入一个字符串。这个函数很方便,但不应该用于非常大的文件。
package main import ( "fmt" "io/ioutil" "log" ) func main() { content, err := ioutil.ReadFile("thermopylae.txt") if err != nil { log.Fatal(err) } fmt.Println(string(content)) }
该示例读取整个文件并将其打印到控制台。
$ go run read_file.go The Battle of Thermopylae was fought between an alliance of Greek city-states, led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the course of three days, during the second Persian invasion of Greece.
逐行读取文件
Scanner
提供了一个方便的接口来读取数据,例如以换行符分隔的文本行文件。它通过令牌读取数据;Split
函数定义令牌。默认情况下,该函数将数据分成行,并去除行终止符。
package main import ( "bufio" "fmt" "log" "os" ) func main() { f, err := os.Open("thermopylae.txt") if err != nil { log.Fatal(err) } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) } }
该示例逐行读取文件。打印每一行。
f, err := os.Open("thermopylae.txt")
Open
函数打开文件进行读取。
defer f.Close()
文件描述符在main
函数结束时关闭。
scanner := bufio.NewScanner(f)
创建了一个新的扫描仪。
for scanner.Scan() { fmt.Println(scanner.Text()) }
Scan
将扫描器推进到下一个令牌,然后可通过Bytes
或Text
函数获取。
逐字阅读文件
扫描仪的默认分割函数是ScanLines
。使用SplitWords
,我们按单词拆分内容。
package main import ( "fmt" "os" "bufio" ) func main() { f, err := os.Open("thermopylae.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 read_by_word.go The Battle of Thermopylae was fought between ...
分块读取文件
我们可以读取数据块中的文件。
package main import ( "bufio" "fmt" "log" "os" "io" ) func main() { f, err := os.Open("thermopylae.txt") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 16) for { n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) } fmt.Println() }
该示例按16字节的小部分读取文件。
buf := make([]byte, 16)
我们定义了一个16字节的数组。
for { n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) }
在for循环中,我们使用Read
将数据读入缓冲区,并使用Print
将数组缓冲区打印到控制台。
去读取二进制文件
hex
包实现了十六进制编码和解码。
package main import ( "bufio" "encoding/hex" "fmt" "log" "os" "io" ) 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)) } }
在代码示例中,我们读取图像并以十六进制格式打印它。
fmt.Printf("%s", hex.Dump(buf))
Dump
返回一个字符串,其中包含给定数据的十六进制转储。
$ go run read_binary_file.go 00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 |......JFIF......| 00000010 00 01 00 00 ff e1 00 2f 45 78 69 66 00 00 49 49 |......./Exif..II| 00000020 2a 00 08 00 00 00 01 00 0e 01 02 00 0d 00 00 00 |*...............| 00000030 1a 00 00 00 00 00 00 00 6b 69 6e 6f 70 6f 69 73 |........kinopois| 00000040 6b 2e 72 75 00 ff fe 00 3b 43 52 45 41 54 4f 52 |k.ru....;CREATOR| 00000050 3a 20 67 64 2d 6a 70 65 67 20 76 31 2e 30 20 28 |: gd-jpeg v1.0 (| 00000060 75 73 69 6e 67 20 49 4a 47 20 4a 50 45 47 20 76 |using IJG JPEG v| 00000070 38 30 29 2c 20 71 75 61 6c 69 74 79 20 3d 20 39 |80), quality = 9| 00000080 31 0a ff db 00 43 00 03 02 02 03 02 02 03 03 02 |1....C..........| 00000090 03 03 03 03 03 04 07 05 04 04 04 04 09 06 07 05 |................| 000000a0 07 0a 09 0b 0b 0a 09 0a 0a 0c 0d 11 0e 0c 0c 10 |................| 000000b0 0c 0a 0a 0e 14 0f 10 11 12 13 13 13 0b 0e 14 16 |................| ...
在本教程中,我们介绍了在Go中读取文件。
列出所有Go教程。