Go语言文件操作:文件读写案例以及相关细节介绍

2023-12-13 05:53:21

在这里插入图片描述

介绍

对文件进行操作时,其中最基本的操作就是"读写"。本文将介绍Go语言中文件读写的案例和相关细节。在Go语言中,文件的读写操作与Java中的IO流类似。在Go语言中,文件的IO操作主要使用了os包。可以在中文API文档中查找更多关于os包的信息:https://studygolang.com/pkgdoc,下面是文件读写方法截图:
在这里插入图片描述

一、打开文件

要对一个文件进行操作,首先肯定是需要先打开,这和平时用Windows界面操作文件是同一个道理,在Java语言中,我们可能会通过输入流的方式打开一个文件,如下所示:

FileInputStream fileInputStream = new FileInputStream("doc/user.txt");

那么在Go中是如何打开一个文件的呢?在Go中有两种方式打开文件,相关介绍如下。

1.1 以只读的方式打开文件

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)

1.2 自定义的方式打开文件

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)

二、文件读写代码案例

下面简单介绍一下文件的读写案例,关于更多的技术细节在后面的文章中进行介绍。

2.1 从磁盘读取数据

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) // 打印读取的内容
	}
}

2.2 向磁盘写数据

下面是一个向磁盘写数据的案例,通过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() // 写一次,刷一次盘(将缓存中的数据刷新到磁盘)
    }
}

关于缓冲区默认大小是4096,源码定义如下:
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_43073558/article/details/134962047
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。