Toasobi
7.28 常用标准库 - IO操作
本文最后更新于2022年08月01日,已超过887天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
注:该篇文章主要讲解学习心得,详细可以看Golang官方常用标准库文档内容
1.1 关于各个参数的类型
首先常见的os系列:
终端其实是一个文件,相关实例如下:
- os.Stdin:标准输入的文件实例,类型为*File
- os.Stdout:标准输出的文件实例,类型为*File
- os.Stderr:标准错误输出的文件实例,类型为*File
其次是bufio包,其中bufio.NewWriter,bufio.NewReader等方法返回的对象类型为*bufio.Reader
然而在真正参数传递的时候,参数类型写io.Reader则可以接收上述所有类型的参数
举例:
func ReadFrom(reader io.Reader, num int) ([]byte, error) {
// 开辟内存空间
p := make([]byte, num)
// 将数组读取到变量中
n, err := reader.Read(p)
if n > 0 {
return p[:n], nil
}
return p, err
}
我们创建一个用来文件读取的函数,其形参类型为io.Reader
其次我们传递不同的参数
// 字符串中读取
data, _ := ReadFrom(strings.NewReader("from string"), 12)
// 从命令行中读取
data, _ := ReadFrom(os.Stdin, 11)
// 从文件中读取
file, _ := os.Open("main.go")
// 关闭文件资源
defer file.Close()
data, _ := ReadFrom(file, 10)
fmt.Println(data)
所有的传参都可以成立,所以我将他们比作一个父类型包括好几个子类型
1.2常用的文件读写方式
1.首先是最简单的read和write方式,需要文件对象
//写入
file.WriteString("ab\n")
file.Write([]byte("cd\n"))
//读取
n, err := file.Read(buf[:])
content = append(content, buf[:n]...)
注意处理err
要读取整个文件只需要加上一个死循环,以io.EOF作为跳出标准即可
2.其次是bufio包
- bufio包实现了带缓冲区的读写,是对文件读写的封装
- bufio缓冲写数据
io.EOF同样是跳出循环的标准
//写数据 writer := bufio.NewWriter(file) for i := 0; i < 10; i++ { writer.WriteString("hello\n") } // 刷新缓冲区,强制写出 writer.Flush() //读取数据 reader := bufio.NewReader(file) for { line, _, err := reader.ReadLine() if err == io.EOF { break } if err != nil { return } fmt.Println(string(line)) }
推荐使用
除了reader.ReadLine()之外还有reader.ReadBytes()按字节读取哦
ioutil工具包
//写数据
err := ioutil.WriteFile("./yyy.txt", []byte("www.5lmh.com"), 0666)
//读数据
content, err := ioutil.ReadFile("./yyy.txt")
fmt.Println(string(content))
这个很方便,好像读取的时候要读整篇也不用加循环
爬虫脚本一般用它的readall方法
操作文件
文件打开与关闭
// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.go")
defer file.Close()
创建文件
// 新建文件
file, err := os.Create("./xxx.txt")
拷贝文件
// 打开源文件
srcFile, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
// 创建新文件
dstFile, err2 := os.Create("./abc2.txt")
if err2 != nil {
fmt.Println(err2)
return
}
// 缓冲读取
buf := make([]byte, 1024)
for {
// 从源文件读数据
n, err := srcFile.Read(buf)
if err == io.EOF {
fmt.Println("读取完毕")
break
}
if err != nil {
fmt.Println(err)
break
}
//写出去
dstFile.Write(buf[:n])
}
srcFile.Close()
dstFile.Close()
}
文件操作配置
这里要使用os.openFile()函数打开文件,后面参数填模式
file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)
所有模式如下:
模式 | 含义 |
---|---|
os.O_WRONLY | 只写 |
os.O_CREATE | 创建文件 |
os.O_RDONLY | 只读 |
os.O_RDWR | 读写 |
os.O_TRUNC | 清空 |
os.O_APPEND | 追加 |
结束!