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教程。
