GO标准库巡礼-ioutil

本文详细介绍了Go语言中的I/O操作,包括如何使用NopCloser进行Reader与ReadCloser的转换,如何一次性读取reader内容,以及ioutil库中针对文件处理的实用函数,如读取目录、写入文件、读取文件、创建临时目录和文件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:该系列文章是基于对@benbjohnson的《Go Walkthrough》、go官方文档、《Go语言标准库》的学习汇总而成

ioutil提供了一些简单的IO操作函数作为辅助

Reader与ReadCloser的简单转换

有些时候我们有一个io.Reader的实例,但是我们要求传递io.ReadCloser的实例,那么我们可以使用NopCloser函数

func NopCloser(r io.Reader) io.ReadCloser

Nop表明了close函数不会做任何事情

一次性读取reader内容

有些时候我们需要一次性读取reader内容然后统一处理,这个时候我们可以使用ReadAll函数

func ReadAll(r io.Reader) ([]byte, error)

该函数会读取r直到返回了一个EOF。该函数实际上内部使用了bytes.Buffer的ReadFrom。当err==nil的时候表示成功调用

文件处理

io常常和文件读取写入紧密相关,因此ioutil有若干个函数用于处理文件。

列举目录下的文件

如果我们希望能够基于某个给定路径查找路径下的文件,我们可以使用ioutil.ReadDir函数

func ReadDir(dirname string) ([]os.FileInfo, error)

该函数如果调用成功会返回os.FileInfo切片,FileInfo包含了以下信息

type FileInfo interface {
    Name() string       // base name of the file
    Size() int64        // length in bytes for regular files; system-dependent for others
    Mode() FileMode     // file mode bits
    ModTime() time.Time // modification time
    IsDir() bool        // abbreviation for Mode().IsDir()
    Sys() interface{}   // underlying data source (can return nil)
}
写入文件

如果我们想要将内容写入到指定文件的时候我们可以使用WriteFile函数

func WriteFile(filename string, data []byte, perm os.FileMode) error

该函数会将data写入到filename指定的文件。如果文件不存在,那么WriteFile会基于perm指定的文件权限创建;否则我们会先清空文件内容。perm一般可以指定为0666

读取文件

如果我们希望可以读取文件的所有内容,那么我们可以使用ioutil.ReadFile函数

func ReadFile(filename string) ([]byte, error)

该函数会读取文件直到接收到EOF,如果调用成功error==nil

在内部实现上,ReadFile会首先判断文件的大小,对bytes.Buffer预定义大小从而避免额外分配内存

创建临时目录

实际使用的时候我们可能需要创建临时目录,此时我们可以使用ioutil.TempDir

func TempDir(dir, pattern string) (name string, err error)

该函数会在指定文件目录dir内创建一个新的dir,其名字由pattern后面跟一个随机字符串组成。如果pattern中有*字符,那么随机字符串会替代最后一个*字符。

TempDir会返回创建的目录路径。如果dir为空字符串,那么就会使用默认目录os.TempDir。多个程序同时调用TempDir不会选择相同的目录

调用者需要自行移除临时目录,通常配合defer os.RemoveAll(dir)完成

创建临时文件

跟上面接近,我们可以使用ioutil.TempFile来实现创建临时文件

func TempFile(dir, pattern string) (f *os.File, err error)

基本跟TempDir相似。返回的os.File中我们可以调用f.Name()来获取文件的路径名

我们可以用defer os.Remove(tmpfile.Name())来完成移除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值