【译文】
小块读取文件
在上一节中,我们学习了如何将整个文件加载到内存中。当文件的大小过大时,将整个文件读入内存是没有意义的,尤其是在RAM不足的情况下。更好的方法是分小块读取文件。这可以在bufio软件包的帮助下完成。
让我们编写一个程序,该程序test.txt以3个字节的块为单位读取文件。运行packr2 clean以删除上一部分中由packr生成的文件。test.txt如果您删除了它,您可能还想重新创建。内容替换filehandling.go为以下,
package main
import (
"bufio"
"flag"
"fmt"
"log"
"os"
)
func main() {
fptr := flag.String("fpath", "test.txt", "file path to read from")
flag.Parse()
f, err := os.Open(*fptr)
if err != nil {
log.Fatal(err)
}
defer func() {
if err = f.Close(); err != nil {
log.Fatal(err)
}
}()
r := bufio.NewReader(f)
b := make([]byte, 3)
for {
n, err := r.Read(b)
if err != nil {
fmt.Println("Error reading file:", err)
break
}
fmt.Println(string(b[0:n]))
}
}
在上面程序的15行中,我们使用从命令行标志传递的路径打开文件。
在行号 19,我们推迟文件关闭。
上面程序的24行将创建一个新的缓冲读取器。在下一行中,我们创建一个长度为3的字节片,文件的字节将被读入其中。
Read 方法 第27行读取最多len(b)个字节,即最多3个字节,并返回读取的字节数。我们将返回的字节存储在变量中n。在32行中,将切片从index读取0到n-1,即直到该Read方法返回并打印的字节数为止。
一旦到达文件末尾,它将返回EOF错误。该程序的其余部分很简单。
如果我们使用命令运行上面的程序
cd ~/Documents/filehandling
go install
filehandling -fpath=/path-of-file/test.txt
将输出以下内容
Hel
lo
Wor
ld.
We
lco
me
to
fil
e h
and
lin
g i
n G
o.
Error reading file: EOF