GO标准库巡礼-ioutil

声明:该系列文章是基于对@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())来完成移除

发布了31 篇原创文章 · 获赞 32 · 访问量 734

猜你喜欢

转载自blog.csdn.net/a348752377/article/details/104678727