对文件进行操作时,其中最基本的操作就是"读写"
。本文将介绍Go语言中文件读写的案例和相关细节。在Go语言中,文件的读写操作与Java中的IO流类似。在Go语言中,文件的IO操作主要使用了os
包。可以在中文API文档中查找更多关于os
包的信息:https://studygolang.com/pkgdoc,下面是文件读写方法截图:
要对一个文件进行操作,首先肯定是需要先打开,这和平时用Windows界面
操作文件是同一个道理,在Java语言中,我们可能会通过输入流的方式打开一个文件,如下所示:
FileInputStream fileInputStream = new FileInputStream("doc/user.txt");
那么在Go中是如何打开一个文件的呢?在Go中有两种方式打开文件,相关介绍如下。
func Open(name string) (*File, error)
从上面方法定义我们知道它只接收一个参数,就是文件路径名,这种打开方式默认情况是只读的,也就是不能向文件写内容,因为默认情况下文件标志
是O_RDONLY
(关于文件标志,后面介绍)源码如下:
下面是调用方法代码,返回信息是一个file结构体
和error
的异常。
file, err := os.Open("doc/name.txt")
下面是一个基本的文件打开操作代码:
file, err := os.Open("doc/name.txt")
if err != nil {
fmt.Println("文件打开失败!", err)
}
defer file.Close() //函数运行结束前关闭文件流
name := file.Name() //获取文件名
fmt.Println(name)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
● name
:文件路径
● flag
:文件打开类型
● perm
:文件模式,只在Linux下生效
这种打开文件的方式,是可以按照自己的需求进行自定义的,最主要的参数是文件名(name)
和文件标志(flag)
,因为perm只能在Linux
操作系统才生效,如果没有需求,随便填就可以,下面是支持文件标志常量:
const (
O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
O_RDWR int = syscall.O_RDWR // 读写模式打开文件
O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
)
上面的这些文件打开标志常量是可以通过管道符号:“|”
进行联合搭配使用的,是与(and)
的关系,例如我们可以通过O_WRONLY|O_APPEND
来达到在写数据时候,在文件进行附加,代码如下:
file, err := os.OpenFile("doc/user.txt", os.O_WRONLY|os.O_APPEND, 0777)
下面简单介绍一下文件的读写案例,关于更多的技术细节在后面的文章中进行介绍。
func main() {
file, err := os.Open("doc/user.txt") // 打开文件
if err != nil { // 如果打开文件失败
fmt.Printf("文件打开失败:%v", err)
return
}
reader := bufio.NewReader(file) // 创建一个文件读取器
for { // 循环读取文件内容
value, err := reader.ReadString('\n') // 读取一行内容
if err == io.EOF { // 如果读到文件末尾
break // 退出循环
}
fmt.Println(value) // 打印读取的内容
}
}
下面是一个向磁盘写数据的案例,通过bufio.NewWriter创建一个缓冲区,然后向里面写数据。
func main() {
file, err := os.OpenFile("doc/user.txt", os.O_WRONLY|os.O_CREATE, 0777) // 打开或创建文件
if err != nil { // 如果文件打开或创建失败
fmt.Printf("文件打开失败:%v", err)
return
}
defer file.Close() // 在函数返回前关闭文件,保证文件关闭操作能被执行
writer := bufio.NewWriter(file) // 新建一个缓冲区
for i := 0; i < 5; i++ {
writer.WriteString("hello world\n") // 将内容写入缓存
writer.Flush() // 写一次,刷一次盘(将缓存中的数据刷新到磁盘)
}
}