企业在数字化转型中如何利用常用前端框架提高开发效率并确保安全合规?
1159
2022-11-30
Go 文件创建并使用带缓冲区写文件
os package - os - pkg.go.devOpenFile(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
func NewWriter(wio.Writer) *Writer
我们这使用的是带缓存的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将缓存对数据真正写到文件中 //否则文件当中会没有数据
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~