【译文】go读取文件-小块读取文件|Go主题月

205 阅读2分钟

【译文】

原文地址:golangbot.com/read-files/

小块读取文件

在上一节中,我们学习了如何将整个文件加载到内存中。当文件的大小过大时,将整个文件读入内存是没有意义的,尤其是在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读取0n-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