为了账号安全,请及时绑定邮箱和手机立即绑定

如何使文件阅读器功能更有效?

如何使文件阅读器功能更有效?

Go
月关宝盒 2022-05-18 14:15:58
我正在尝试这段代码:// GetFooter returns a string which is the Footer of an edi filefunc GetFooter(file *os.File) (out string, err error) {    // TODO can scanner read files backwards?  Seek can get us to the end of file     var lines []string    scanner := bufio.NewScanner(file)    for scanner.Scan() {        lines = append(lines, scanner.Text())    }    line1 := lines[len(lines)-2]    line2 := lines[len(lines)-1]    return line1 + "\n" + line2, scanner.Err()  }我想知道是否有更便宜的方法来获取文件的最后两行?
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

如果您大致知道最后两行的大小,则可以设置SOME_NUMBER为该大小加上一些额外的字节以确保始终捕获最后两行,然后执行类似的操作


file, err := os.Open(fileName)

if err != nil {

    panic(err)

}

defer file.Close()


buf := make([]byte, SOME_NUMBER)

stat, err := os.Stat(fileName)

start := stat.Size() - SOME_NUMBER

_, err = file.ReadAt(buf, start)

if err != nil {

    panic(err)

}

lines := strings.Split(string(start), "\n", -1)

lines = lines[len(lines)-2:]


查看完整回答
反对 回复 2022-05-18
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

扫描缓冲区时,您只能将最后两行保留在内存中。

package main


import (

    "fmt"

    "bufio"

    "bytes"

    "strconv"

)


func main() {

    var buffer bytes.Buffer

    for i := 0; i < 1000; i++ {

        s := strconv.Itoa(i)

        buffer.WriteString(s + "\n")

    }   

    fmt.Println(GetFooter(&buffer))

}


func GetFooter(file *bytes.Buffer) (out string, err error) {

    var line1, line2 string

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        line1, line2 = line2, scanner.Text()

    }

    return line1 + "\n" + line2, scanner.Err()  

}


查看完整回答
反对 回复 2022-05-18
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信