文件操作
文件操作,学啥语言都会要有这个,今晚上就决定搞这个了
- 读取文件的操作一般都是在os这个包下面的,先从开发包开始哈
- 这里可以看出哈,os包里面呢,拥有很对针对文件的操作哈
- 常用的打开、读写、关闭,都是有的哈
- 来举个例子跑跑,冲冲冲
读取一个文件类型 Open函数
fileObj, err := os.Open("src/go.junmu.com/GoLearn/09文件操作/main.go")
- 可以看出哈,他有两个返回值,文件类型的变量和一个err错误
- 然后open里面放的是路径哈, 路径我们可以进行复制的,嘿嘿
- 然后里面有三个路径
- 我一般用的第三个路径就可以打开的,有的编译器不一样,看自己情况选择吧,反正是有一个能打开的,啊哈哈哈哈哈
关闭一个文件 Close函数
- 这个要注意哈,文件打开后肯定要关的哈
- 然后我们怕忘记的话,可以使用defer关键字进行一个最后的关闭,不理解的可以去看前面的文章哈,嘿嘿
defer关键字的应用
defer fileObj.Close()
读入文件内容 Read函数
- 因为要存放读取的内容哈,所以我们要整一个缓存区,想java里面也是一样的
var tmp [128]byte // 整个数组,用来存内容哈
- 然后没啥说的了,直接上图
- 可以看出哈,直接是将文件里面的内容全部读出来了哈,
- 用一个tmp去循环读取数据,直到没有数据读的时候,退出即可。
咳咳, 这里说一下哈, 最后 n<128 好一点,不然后面会报错,报一个EOF的错误,也不算错误吧,就是读到头了。但是设置 n < 128 后,可以完美规避这个问题
if err == io.EOF { // 完美也可以这样进行判断,啊哈哈哈
fmt.Println("文件读完了")
return
}
使用bufio包进行读取
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
fileObj, err := os.Open("src/go.junmu.com/GoLearn/09文件操作/Buffio读取/main.go")
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer fileObj.Close()
reader := bufio.NewReader(fileObj)
for {
line, err := reader.ReadString('\n') //注意是字符
if err == io.EOF {
if len(line) != 0 {
fmt.Println(line)
}
fmt.Println("文件读完了")
break
}
if err != nil {
fmt.Println("read file failed, err:", err)
return
}
fmt.Print(line)
}
}
- 这样可以一行一行的读取,看需求使用哈。
- 还有更简单的读取方式哦
ioutil读取整个文件
- 这玩意就厉害了,直接一口去读取完整个文件
- 这多爽,你说这搁谁谁不爱呀,啊哈哈
- 其实看源码后会发现,只是人家帮你把读取的逻辑写好了而已,啊哈哈哈哈哈
那么以上就是文件读取的三种操作了,接下来看看文件的写入吧
文件写入操作
- os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
- name :要打开的文件名 flag :打开文件的模式。 模式有以下几种:
模式 | 含义 |
---|---|
os.O_WRONLY | 只写 |
os.O_CREATE | 创建文件 |
os.O_RDONLY | 只读 |
os.O_RDWR | 读写 |
os.O_TRUNC | 清空 |
os.O_APPEND | 追加 |
perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。
Write和WriteString方式写入
- 这两种方式还行吧,0666是权限哦,学过linux的应该知道,4+2,读写的权限,没有执行哦。
bufio.NewWriter 方式写入
- 这个就是用上缓存的形式啦,先将文件进入缓存,然后将数据存放缓存里面,最后再将缓存里面的内容写入文件
ioutil.WriteFile 方式写入
- 这玩意用的还是爽呀,直接写入,不给机会。啊哈哈哈哈哈哈
- 上图解释吧
- 您说说,这搁谁不喜欢呀,啊哈哈哈哈哈(别这样,看需求看需求哈,千万别盲目)
今晚的文件就肝到这里拉,大家也要要多练习鸭