Golang 逆序读取文件行

思路

  1. 通过Seek函数从末尾移动游标然后每次读取一个字节
  2. 判断是否为换行符
    1. 换行符,新起一个逆序buff,新建字符串
    2. 非换行符,加入缓冲buff
  3. 直到文档开头,或限制行数。

实现


import (
	"fmt"
	"io"
	"os"
)

func main() {
	f, err := os.Open("readend/test.log")
	if err != nil {
		panic(fmt.Sprintf("open file error:%s", err.Error()))
	}
	defer f.Close();
	
	buff := make([]byte, 0, 4096)
	char := make([]byte, 1)
	
	// 查询文件大小
	stat, _ := f.Stat()
	filesize := stat.Size()
	
	var cursor int64 = 0
	cnt := 0
	for {
		cursor -= 1
		_, _ = f.Seek(cursor, io.SeekEnd)
		_, err = f.Read(char)
		if err != nil {
			panic(err)
		}

		if char[0] == '\n' {
			if len(buff) > 0 {
				revers(buff)
				// 读取到的行
				fmt.Println(string(buff))
				cnt++
				if cnt == 300 {
					// 超过数量退出
					break
				}
			
			}
			buff = buff[:0]
		} else {
			buff = append(buff, char[0])
		}

		if cursor == -filesize {
			break
		}
	}
}

func revers(s []byte) {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
}

参考文献

[1]. stackoverflow . How to Read last lines from a big file with Go every 10 secs . Bactisme . 2018.07 . https://stackoverflow.com/questions/17863821/how-to-read-last-lines-from-a-big-file-with-go-every-10-secs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值