文件IO处理
网络IO面向的是网络设备,本地IO面向的是笨的磁盘设备,我们经常看到的屏幕输出其实操作的是终端设备。
文件描述符
文件描述符是一个非常抽象的概念,它是一个描述文件的符号,我们不必去关注它到底是什么,我们只需要知道它的功能是操控文件。操控文件指的是读文件、写文件、调整文件读写位置等功能。
graph TD
.txt文件描述符 --> 读缓冲区/写缓冲区 -->通过设备驱动 -->输出
通过文件描述符,程序可以将数据写入缓冲区,缓冲区的刷新机制会将内容通过设备驱动(不同的设备驱动各异)保存到磁盘,在读取文件时,只需程序逆向,原理相同。
os操作相关API
源码以及相关参数含义
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
testlog.Open(name)
f, err := openFileNolog(name, flag, perm)
if err != nil {
return nil, err
}
f.appendMode = flag&O_APPEND != 0
return f, nil
}
- name: 要打开的文件名
- flag:要打开的文件权限,采取位指示器的方式
- O_RDONLY:只读,必选项,与只写、读写三选一
- O_WRONLY:只写
- O_RDWR:读写
- O_CREATE:创建文件
- O_TRUNC:截断文件
perm:8进制文件权限位,与umask共同作用,决定最终文件权限位。
OpenFile返回的结果操作文件
// 读取文件内容到b(b为自建缓冲区)
func (f *File) Read(b []byte) (n int, err error) {
if err := f.checkValid("read"); err != nil {
return 0, err
}
n, e := f.read(b)
return n, f.wrapErr("read", e)
}
//将缓冲区b的内容写入文件
func (f *File) Write(b []byte) (n int, err error) {
if err := f.checkValid("write"); err != nil {
return 0, err
}
n, e := f.write(b)
if n < 0 {
n = 0
}
if n != len(b) {
err = io.ErrShortWrite
}
注:还有函数WriteString它是以另一种形式写入文件,传递的参数为string类型。 Seek函数用来调整读写位置,返回调整的距离和错误信息。
本文正在参加技术专题18期-聊聊Go语言框架