标准库封装
Go 对文件进行读写非常简单,因为 Go 已经封装了一个非常便捷的使用接口,位于标准库 os 中。Go 标准库对文件 IO 的封装也就是 Go 推荐对文件进行 IO 时使用的操作方式。
打开文件(Open)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
Open 文件之后,获取到一个句柄,也就是 File
结构,之后对文件的读写都是基于 File
结构之上进行的。
type File struct {
*file // os specific
}
文件读写只需要针对这个句柄结构体做操作即可。
另外有一点隐藏起来的知识点必须要提一下: 偏移 。也就是最开始强调的读写 3 要素之一的 Offset 。打开( Open
)文件的时候,文件当前偏移量默认设置为 0,也就是说 IO 的起始位置就是文件的最开头。举个例子,如果这个时候,写 4K 的数据到文件,那么就是写 [0, 4K] 这个位置的数据,如果之前这上面已经有数据了,那么就会是覆盖写。
除非 Open
文件的时候指定 O_APPEND
选项,偏移量会设置为文件末尾,那么 IO 都是从文件末尾开始。
文件写操作(Write)
文件 File
句柄对象有两个写方法:
第一种:写一个 buffer 到文件 ,使用文件当前偏移
func (f *File) Write(b []byte) (n int, err error)
注意:该写操作会导致文件偏移量的增加。
第二种:从指定文件偏移,写入 buffer 到文件
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
注意:该写操作不会更新文件偏移量
文件读操作(Read)
和写对应,文件 File
句柄对象有两个读方法:
第一种:从文件当前偏移读一个 buffer 的数据上来
func (f *File) Read(b []byte) (n int, err error)
注意:该读操作会导致文件偏移量的增加。
第二种:从指定文件偏移,读一个 buffer 大小的数据上来
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
注意:该读操作不会更新文件偏移量
指定偏移量(Seek)
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
这个句柄方法允许用户指定文件的偏移位置。这个很容易理解,举个例子,文件刚开始是 0 字节,写 1M 的数据下去,大小变成 1M,Offset 往后挪 1M ,默认就是往后挪。
现在 Seek 方法允许把写的偏移定位到任意位置,可以就可以从任意地方覆盖写入数据。
所以在 Go 里面,文件 IO 非常简单,先 Open 一个文件,拿到 File
句柄,然后就可以使用这个句柄 Write ,Read,Seek 就能进行 IO 了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论