登录
首页 >  Golang >  Go问答

学习Go中如何从文件中读取不定数量的数据

来源:stackoverflow

时间:2024-02-06 20:54:23 199浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《学习Go中如何从文件中读取不定数量的数据》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

在不将文件内容读入内存的情况下,如何从文件中读取“x”个字节,以便为每个单独的读取操作指定 x 是什么?

我看到各种 readers 的 read 方法采用一定长度的字节片,我可以从文件读入该片。但在这种情况下,切片的大小是固定的,而理想情况下我想做的是:

func main() {
    f, err := os.Open("./file.txt")
    if err != nil {
        panic(err)
    }

    someBytes := f.Read(2)
    someMoreBytes := f.Read(4)
}

bytes.buffer 有一个 next 方法,其行为与我想要的非常接近,但它需要现有的缓冲区才能工作,而我希望从文件中读取任意数量的字节,而不需要读取整个文件事情进入记忆。

实现这一目标的最佳方法是什么?

感谢您的宝贵时间。


正确答案


使用此功能:

// readn reads and returns n bytes from the reader.
// on error, readn returns the partial bytes read and
// a non-nil error.
func readn(r io.reader, n int) ([]byte, error) {
    // allocate buffer for result
    b := make([]byte, n)
    // readfull ensures buffer is filled or error is returned.
    n, err := io.readfull(r, b) 
    return b[:n], err
}

这样调用:

somebytes, err := readn(f, 2)
if err != nil  { /* handle error here */
somemorebytes := readn(f, 4)
if err != nil  { /* handle error here */

你可以这样做:

f, err := os.Open("/tmp/dat")
check(err)
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1]))

更多阅读请查看site

今天关于《学习Go中如何从文件中读取不定数量的数据》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>