首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go程序例子(64):文件读取

Go程序例子(64):文件读取

原创
作者头像
用户11078756
发布2025-01-20 09:08:57
发布2025-01-20 09:08:57
3250
举报
文章被收录于专栏:go程序例子go程序例子

读取和写入文件是许多Go程序所需的基本任务。首先,我们来看一些读取文件的示例。

代码语言:go
复制
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)
// 读取文件时需要对大多数调用进行错误检查。这个辅助函数将简化我们下面的错误检查。
func check(e error) {
    if e != nil {
        panic(e)
    }
}

func main() {
		// 或许最基本的文件读取任务,便是将文件的全部内容一次性载入内存之中。
    dat, err := os.ReadFile("/tmp/dat")
    check(err)
    fmt.Print(string(dat))
		// 在处理文件时,您往往需要更精细地控制读取的方式及文件的哪些部分被读取。为此类任务,首先需要打开文件以获取一个os.File类型的值。
    f, err := os.Open("/tmp/dat")
    check(err)
		// 从文件的开头读取一些字节。允许最多读取5个字节,但同时注意实际读取了多少个字节。
    b1 := make([]byte, 5)
    n1, err := f.Read(b1)
    check(err)
    fmt.Printf("%d bytes: %s\\n", n1, string(b1[:n1]))
		// 您同样可以定位(Seek)至文件中一个已知的位置,并从该处开始读取数据。
    o2, err := f.Seek(6, io.SeekStart)
    check(err)
    b2 := make([]byte, 2)
    n2, err := f.Read(b2)
    check(err)
    fmt.Printf("%d bytes @ %d: ", n2, o2)
    fmt.Printf("%v\\n", string(b2[:n2]))
		// 其他定位方法则是相对于当前光标位置进行的,
    _, err = f.Seek(4, io.SeekCurrent)
    check(err)
		// 以及相对于文件末尾的位置进行定位。
    _, err = f.Seek(-10, io.SeekEnd)
    check(err)
		// io 包提供了一些可能对文件读取有帮助的函数。例如,像上面那样的读取操作可以通过 ReadAtLeast
    o3, err := f.Seek(6, io.SeekStart)
    check(err)
    b3 := make([]byte, 2)
    n3, err := io.ReadAtLeast(f, b3, 2)
    check(err)
    fmt.Printf("%d bytes @ %d: %s\\n", n3, o3, string(b3))
		// Go语言中没有内置的倒带功能,但使用Seek(0, io.SeekStart)可以达到这一目的。
    _, err = f.Seek(0, io.SeekStart)
    check(err)
		// bufio 包实现了一个带缓冲的读取器(buffered reader),它可能对处理大量小规模读取操作时的效率提升非常有用,同时也因为它提供了额外的读取方法。
    r4 := bufio.NewReader(f)
    b4, err := r4.Peek(5)
    check(err)
    fmt.Printf("5 bytes: %s\\n", string(b4))
		// 在完成文件操作后,应当关闭文件(通常这会在使用 defer 语句打开文件后立即安排执行)。
    f.Close()
}

运行结果:

代码语言:javascript
复制
➜ go run reading-file/reading-file.go
This is a file.
5 bytes: This 
2 bytes @ 6: s 
2 bytes @ 6: s 
5 bytes: This 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档