[1] 将整个文件读取到内存
package main
import (
"fmt"
"io/ioutil"
)
func main() {
data, err := ioutil.ReadFile("./test.txt")
if err != nil {
fmt.Println("File reading error", err)
return
}
fmt.Println("Contents of file:", string(data))
}
[2] 分块读取文件
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("./test.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
//
// 以3个字节的块为单位读取文件
//
reader := bufio.NewReader(file) // 新建一个缓冲读取器
buff := make([]byte, 3)
for {
// Read方法会读取len(buff)个字节,并返回所读取的字节数
// 当到达文件最后时,它会返回一个EOF错误
n, err := reader.Read(buff)
if err != nil {
fmt.Println("Error reading file:", err)
break
}
fmt.Println(string(buff[:n]))
}
}
[3] 逐行读取文件
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("./test.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
//
// 扫描文件并逐行读取
//
s := bufio.NewScanner(file)
// Scan方法读取文件的下一行,如果可以读取,就可用Text方法
// Scan返回false时,除非已经到达文件末尾(此时Err()返回nil)
// 否则Err()就会返回扫描过程中出现的错误
for s.Scan() {
fmt.Println(s.Text())
}
err = s.Err()
if err != nil {
log.Fatal(err)
}
}