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