golang 文件操作
关于文件的包为os
创建文件
file,err :=os.Create("./golangfile.txt")
file 为文件指针
if err!=nil{
fmt.Println("文件创建失败")
return // 这个retuen一定要加上
}
//文件创建后要关闭
defer file.Close()
注意:假若文件已经存在不会与python语言一样会报错。只会覆盖源内容 内容都会被清空覆盖。
文件写入内容
文件指针.Write(字节切片)/文件指针.WriteString(字符串)
Write(参数为字节切片) 需要讲字节切片转换成字符串
转换 str1 := []byte(str) 一个中文切片会转换成3个字节
file.WriteString 为直接写入字符串
例如:n,_:=file.WriteString ("好嗨哦,感觉人生已经到达了高潮\r\n")
n 返回的为文件写入的字符串个数
注意:Write 和WriteString 每次打开都是从开始开始位置==重新替换(依次替换)==计算写入
file.WriteAt() 为写入指定下标位置
WriteAt函数需要写入的为字符切片 所以可以转换 例如 b:=[]byte("字符串")
后file.WriteAt(b)
注意:WrireAt 会覆盖源内容 会依次覆盖
例如:
offset,_:=file2.Seek(0,io.SeekEnd)
b:=[]byte("1oooo插入文件啊\r\n")
file2.WriteAt(b,offset)
file.Seek() 为查找文件指针末尾偏移量(或许文件字节个数)里面有两个参数,第一个为偏移量,第二个为偏移起始位置
偏移起始位置有四种模式
1. io.SeekCurrent = 1 当前位置 可以直接输入参数1
2. io.SeekStart = 0 最头部位置 可以直接输入参数0
3. io.SeekEnd = 2 最后位置 可以直接输入参数2
4. io.Seeker io包接口
文件打开
os.Open(文件路径/文件名) 这种为只读的方式打开
os.OpenFile(文件路径/文件名,打开模式,文件权限)
打开模式有:O_RDONLY(只读模式)
O_WRONLY(只写模式)
O_RDWR(可读可写模式)
O_APPEND(追加模式)
文件权限有七种 可参考linux权限
0:没有任何权限
1;执行权限(如果是可执行文件,是可以运行的)
2.写权限
3.写权限和执行权限
4:读权限
5:读权限和执行权限
6:读权限和写权限
7:度权限 写权限 执行全县都有
文件读取
golang 读取与写入一样 首先从光标起始位置开始的
1.file.Read() 这是读取字节 需要规定个数
b:=make([]byte,20) //读取20哥字节
file.Read(b) // 这是将读取的内容放入b变量中
fmt.Println(b) //打印内容
第1.2
b:=make([]byte,3)
num,err:=file2.Read(b)
if err!=io.EOF{
fmt.Print(string(b)[:num])
}
若是需要用Read()全部读取内容
b:= make([]byte,70) // 假如规定的是20个 最后一次读取个数不足会讲内存空降上次的数据依次放入后面打印
for{
_,err:=file2.Read(b)
if err !=nil{
if err == io.EOF {
break
}
}else {
fmt.Print(string(b))
}
}
上面的可以这样修改
b:= make([]byte,70) // 假如规定的是20个 最后一次读取个数不足会讲内存空降上次的数据依次放入后面打印
for{
num,err:=file2.Read(b) // num 为返回字节下标
if err !=nil{
if err == io.EOF {
break
}
}else {
fmt.Print(string(b)[:num])
}
}
2.ReadAt 定位读取
offset,_:=file2.Seek(-30,io.SeekEnd) // offset 偏移位置, io.SeekEnd 定位
b:=make([]byte,22) // 设定读取多少个字节块
num,err2:=file2.ReadAt(b,offset) //读取
if err2 !=io.EOF{
fmt.Print(string(b)[:num])
}
3.bufio.NewReader(file) 行读取
//rf:=bufio.NewReader(file2) //读取一行 file2 文件打开变量
//b,err:=rf.ReadBytes('\n') // 读取一行的定位结尾
//fmt.Print(string(b)) // 打印
// 全部全部行
rf:=bufio.NewReader(file2) //file2 文件变量
for{ // 全部读取
b,err:=rf.ReadBytes('\n')
fmt.Print(string(b))
if err==io.EOF{
break
}
}