首页 > 编程笔记 > Go语言笔记 阅读:9

Go语言用os包读写文件(附带实例)

Go 语句的内置包 os 实现了系统很多操作指令,其中不得不说文件读写功能。文件读写包括文件创建、写入内容、追加内容、读取内容等功能,文件读写功能都定义在内置包 os 的 file.go 文件中。

示例代码如下:
package main

import (
   "fmt"
   "os"
)

func main() {
   // 定义文本内容
   var val = "This is values\n"
   // 将文本内容转为字节类型的切片
   var val_byte = []byte(val)
   fmt.Printf("values_byte的数据长度:%v\n", len(val_byte))
   // 创建或打开文件
   // 不能使用Open()和Create(),因为文件读写模式不符合要求
   f, _ := os.OpenFile("output.txt", os.O_RDWR|os.O_SYNC, 0)

   // Write()往文件写入文本内容(字节类型的切片)
   n1, _ := f.Write(val_byte)
   fmt.Printf("Write()写入数据的长度:%v\n", n1)

   // WriteString()往文件写入文本内容(字符串类型)
   n2, _ := f.WriteString(val)
   fmt.Printf("WriteString()写入数据的长度:%v\n", n2)

   // WriteAt()相当于Write()+Seek()的功能
   // Seek()是文本内容的偏移量,将写入数据在已有数据的某个位置开始写入
   // WriteAt()不支持O_APPEND模式
   n3, _ := f.WriteAt(val_byte, 0)
   fmt.Printf("WriteAt()写入数据的长度:%v\n", n3)

   // 读取文件,必须为切片定义长度
   var valu_byte []byte = make([]byte, 10)
   // 读取方式一:全内容读取
   // vb, _ := f.Read(valu_byte)
   // 读取方式二:部分内容读取
   vb, _ := f.ReadAt(valu_byte, 0)
   vbs := string(valu_byte)
   fmt.Printf("ReadAt()读取的是数据长度:%v\n", vb)
   fmt.Printf("ReadAt()读取的是数据:%v\n", vbs)
   // 关闭文件
   f.Close()
}
运行上述代码,运行结果为:

values_byte的数据长度:15
Write()写入数据的长度:15
WriteString()写入数据的长度:15
WriteAt()写入数据的长度:15
ReadAt()读取的是数据长度:10
ReadAt()读取的是数据:This is va


在示例中分别使用 OpenFile() 创建或打开文件,Write()、WriteString()、WriteAt() 写入数据,Read()、ReadAt() 读取数据,每个函数的功能说明如下:

1) OpenFile()创建或打开文件

OpenFile(name string, flag int, perm FileMode) (*File,error) 设有 3 个参数和两个返回值:
内置包 os 还定义了函数 Open() 和 Create() 创建或打开文件,它们都是在 OpenFile() 的基础上进行封装的,两者的差异如下:
使用 OpenFile() 创建或打开文件时,可以根据实际需要设置文件读写模式,文件读写模式在内置包 os 中已有定义,如图 1 所示。


图 1 文件读写模式

内置包 os 定义了 8 种文件读写模式,每一种模式都有注释说明,使用多种模式可以通过“|”拼接,例如 os.O_RDWR|os.O_SYNC。

常用的文件读写模式有 O_APPEND、O_RDWR、O_SYNC 和 O_TRUNC,说明如下:

2) Write()、WriteString()、WriteAt()写入数据

在文件中写入数据可以使用函数 Write()、WriteString()、WriteAt() 实现,三者的差异说明如下:

① Write(b []byte) (n int, err error):将字节类型的切片写入文件。
支持写入和续写功能,如果 OpenFile() 设置为 os.O_APPEND,它将会在文本末端写入内容;如果没有设置 os.O_APPEND,则在文本的首行写入内容,首行以下的内容保持不变。

② WriteString(s string) (n int, err error):将字符串类型的数据写入文件。
它与 Write() 的写入方式相同。

③ WriteAt(b []byte, off int64) (n int, err error):在文本中按照偏移量写入数据。
如果 OpenFile() 设置 os.O_APPEND,它将无法写入数据,因为参数 off 的偏移量和 os.O_APPEND 模式存在冲突。WriteAt() 相当于 Write()+Seek() 的功能,Seek() 在文本中根据偏移量找到具体位置,再由 Write() 写入数据。

3) Read()、ReadAt()读取数据

从文件中读取数据可以使用函数 Read()、ReadAt() 实现,两者的差异说明如下:

① Read(b []byte) (n int, err error):将读取数据加载到字节类型的切片中。
② ReadAt(b []byte, off int64) (n int, err error):在文本中按照偏移量读取数据。
Read() 和 ReadAt():将读取的数据存放在字节类型的切片中,但是切片必须定义长度,否则数据无法存放在切片中。由于我们无法得知文本数据的具体长度,因此切片长度必须足够长才能存放数据,如果切片长度小于数据长度,则程序只能存储部分数据,切片长度过长也会浪费资源。

综上所述,内置包 os 实现文件读写的总结如下:

相关文章