其他分享
首页 > 其他分享> > Go 文件创建和带缓冲区写文件

Go 文件创建和带缓冲区写文件

作者:互联网

os package - os - pkg.go.devhttps://pkg.go.dev/os#OpenFile

os.OpenFile


在写文件的时候要用一个函数OpenFile,这里面有三个参数。这个函数是属于os包里面的一个函数。

func OpenFile(name string, flag int, perm FileMode) (*File, error)

flag

说明∶os.OpenFile是一个更一般性的文件打开函数,它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

第一个参数是文件的路径,第二个参数是控制打开文件行为的,比如说以读的方式打开还是以写的方式打开,以追加还是清空的方式去写,还有文件不存在的时候是否创建。最后一个是文件权限。

下面都是打开文件的标识:这些模式可以通过|来进行组合 ,在文件操作里面呢,没有一个专门的函数是创建文件的,当你打开文件的时候,是以O_CREAT方式打开的时候,如果文件不存在就会自动的创建新的文件,我们往往会将O_CREAT和写方式组合在一起使用。

模式打开很重要比如,syscall.O_TRUNC,如果打开错误,问题就很严重,比如以这种方式打开,原先的文件就被清空了,所以在打开的时候要按照需求打开。 

const (
	// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
	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   // used with O_CREATE, file must not exist.
	O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.  同步io
	O_TRUNC  int = syscall.O_TRUNC  // 打开截断文件,也就是清空文件
)


默认情况下是异步io

FileMode 

这个主要是用在Linux上面的,在Windows操作系统下面是无效的。

*File, error

 返回为文件句柄,如果打开错误会返回error值。

 

 

带缓冲区写文件


使用os.OpenFile(),bufio.NewWriter(),*Writer的方法WriteString完成上面的任务.

在操作文件的时候是有一个缓存的,不是每次系统调用就将磁盘上面的文件读取出来。如果缓存里面有数据,直接从缓存里面读取数据,如果缓存里面没有数据,才会将其从磁盘加载到缓存,然后再读取。

如果是写,那么先将数据写到缓存里面,缓存满了执行sync,将缓存当中的数据输出到磁盘上面。

func NewWriter 

我们这使用的是带缓存的writer,在之前读取的时候使用的是 func (b *Reader) ReadString(delim byte) (string, error),同样也提供了带缓存的writer,这样就可以通过缓存的方式往文件里面写内容。

因为是带缓存的,写入的内容还没有落盘,要使用一个flush函数才可以将缓存里面的内容真正写到磁盘。所以在调用 func (b *Writer) WriteString(s string) (int, error),其实内容先写入到缓存的。

可以看到结构体里面确实有buffer,写的时候先将内容写到buffer里面的,所以必须要有个动作flush一下才能将缓冲区的内容写到文件里面去。

type Writer struct {
	err error
	buf []byte
	n   int
	wr  io.Writer
}

fileSd,err := os.OpenFile("test.txt",os.O_CREATE | os.O_WRONLY,os.ModePerm)

	if err != nil {
		fmt.Println("open file error:",err)
		return
	}

	defer fileSd.Close()

	contents := []string{"hello\n","world\n","你好\n","世界\n"}
	writer := bufio.NewWriter(fileSd)

	for _,v := range contents{
		writer.WriteString(v)
	}

	writer.Flush() //内容是先写到缓存对,所以需要调用flush将缓存对数据真正写到文件中
                   //否则文件当中会没有数据

标签:文件,缓存,syscall,文件创建,缓冲区,int,Go,打开,os
来源: https://blog.csdn.net/qq_34556414/article/details/123517517