【发布时间】:2016-08-11 16:52:12
【问题描述】:
我试图使用 bufio.NewScanner 使用以下函数逐行读取文件。
func TailFromStart(fd *os.File, wg *sync.WaitGroup) {
fd.Seek(0,0)
scanner := bufio.NewScanner(fd)
for scanner.Scan() {
line := scanner.Text()
offset, _ := fd.Seek(0, 1)
fmt.Println(offset)
fmt.Println(line)
offsetreset, _ := fd.Seek(offset, 0)
fmt.Println(offsetreset)
}
offset, err := fd.Seek(0, 1)
CheckError(err)
fmt.Println(offset)
wg.Done()
}
我希望它以递增的顺序打印偏移量,但是,它在每次迭代中打印相同的值,直到文件到达 EOF。
127.0.0.1 - - [11/Aug/2016:22:10:39 +0530] "GET /ttt HTTP/1.1" 404 437 "-" "curl/7.38.0"
613
613
127.0.0.1 - - [11/Aug/2016:22:10:42 +0530] "GET /qqq HTTP/1.1" 404 437 "-" "curl/7.38.0"
613
613 是文件中的字符总数。
cat /var/log/apache2/access.log | wc
7 84 613
我理解错了吗,还是bufio.NewScanner 读取了内存中的整个文件,并在内存中迭代?如果是这样,有没有更好的方法来逐行阅读?
【问题讨论】:
-
否,默认缓冲区大小为 4096 字节。在更大的文件上尝试一下。