Go语言ioutil包读写文件(附带实例)
Go 语言除了内置包 os 读写文件之外,还提供了内置包 io/ioutil 实现文件读写,对比 os,io/ioutil 的性能有明显优势。
内置包 io/ioutil 定义了 7 个函数,每个函数的功能说明如下:
下面通过一个简单的例子来演示如何使用内置包 io/ioutil 的 7 个函数,示例如下:
综上所述,使用 io/ioutil 包读写文件的总结如下:
内置包 io/ioutil 定义了 7 个函数,每个函数的功能说明如下:
函数 | 功能 |
---|---|
NopCloser(r io.Reader) io.ReadCloser | 为文件对象(即参数 r)提供 close()(关闭)功能。参数 r 为 io.Reader 类型(即结构体 Reader),返回值为 io.ReadCloser 类型。 |
ReadAll(r io.Reader) ([]byte, error) | 读取文件所有数据。参数 r 为 io.Reader 类型(即结构体 Reader),返回值 []byte 存放数据,返回值 error 是函数执行的错误信息。 |
ReadDir(dirname string) ([]fs.FileInfo, error) | 从目录下获取所有文件对象。参数 dirname 是字符串类型,代表目录的路径信息;返回值 []fs.FileInfo 是所有文件对象;返回值 error 是函数执行的错误信息。 |
ReadFile(filename string) ([]byte, error) | 读取文件内容。参数 filename 是字符串类型,代表文件的路径信息;返回值 []byte 存放文件内容;返回值 error 是函数执行的错误信息。 |
WriteFile(filename string, data []byte, perm fs.FileMode) | 在文件中写入数据,不支持文件内容续写,每次调用会覆盖原有数据。参数 filename 是字符串类型,代表文件的路径信息;参数 data 是字节类型的切片,代表写入文件的数据;参数 perm 是 fs.FileMode 类型,代表文件权限,一般设置为 0644 即可;返回值 error 是函数执行的错误信息,若为空值 nil,则代表写入成功。 |
TempDir(dir, pattern string) (name string, err error) | 创建临时文件夹。参数 dir 是创建的路径,参数 pattern 是文件夹名称,返回值 name 是创建后的路径信息,返回值 error 是函数执行的错误信息。 |
TempFile(dir, pattern string) (f *os.File, err error) | 创建临时文件。参数 dir 是创建的路径,参数 pattern 是文件名称,返回值 f 是创建后的文件对象,返回值 error 是函数执行的错误信息。 |
下面通过一个简单的例子来演示如何使用内置包 io/ioutil 的 7 个函数,示例如下:
package main import ( "fmt" "io/ioutil" "os" ) func main() { // 使用os包创建文件 f, _ := os.OpenFile("output.txt", os.O_RDWR|os.O_SYNC, 0) // 返回ReadCloser对象提供close函数 f1 := ioutil.NopCloser(f) defer f1.Close() // ReadAll()读取所有数据 p, _ := ioutil.ReadAll(f) // 将数据从字节切片转换为字符串 fmt.Printf("ReadAll()读取所有数据:%v\n", string(p)) // ReadDir返回目录下所有文件切片 fileInfo, _ := ioutil.ReadDir("./") for _, data := range fileInfo { fmt.Printf("ReadDir()的文件信息:%v\n", data.Name()) } // 读取整个文件数据 data, _ := ioutil.ReadFile("output.txt") // 将数据从字节切片转换为字符串 fmt.Printf("ReadFile()读取文件内容:%v\n", string(data)) // 往文件写入数据,不支持文件内容续写,每次调用会覆盖原有数据 ioutil.WriteFile("output.txt", []byte("111"), 0655) // 在当前路径下创建test前缀的临时文件夹,返回文件夹名称 dir, _ := ioutil.TempDir("./", "test") fmt.Printf("TempDir()创建的文件夹:%v\n", dir) // 在当前路径下创建test前缀的临时文件,返回os.File指针 fs, _ := ioutil.TempFile("./", "test") // 使用os的Write()写入数据 fs.Write([]byte("222")) fs.Close() }运行上述代码,运行结果为:
ReadAll()读取所有数据:111111111111111111111 ReadDir()的文件信息:.idea ReadDir()的文件信息:chapter14.2.2.go ReadDir()的文件信息:chapter14.3.go ReadDir()的文件信息:go.mod ReadDir()的文件信息:go.sum ReadDir()的文件信息:output.txt ReadFile()读取文件内容:111111111111111111111 TempDir()创建的文件夹:test139503931并且在同一目录下自动创建了以 test 开头的文件夹和文件。
综上所述,使用 io/ioutil 包读写文件的总结如下:
- 使用 ReadAll() 和 NopCloser() 必须依赖 os 包打开文件并生成文件对象,通过文件对象完成读写过程。
- ReadFile() 和 WriteFile() 能直接读写文件。ReadFile() 能根据文件内容自动设置切片长度,保证数据有足够空间存储并且不造成资源浪费;WriteFile() 不支持文件内容续写,每次调用会覆盖原有数据,无法适应灵活多变的开发需求。
- ReadDir() 能读取目录下的所有文件,并生成对应的文件对象,这个功能在开发中十分常用,比如文件的批量处理。
- TempDir() 和 TempFile() 是分别创建临时文件夹和临时文件,也可以理解为创建文件夹和文件,因为程序运行完成后,创建的文件夹和文件依然存在。