golang 文件操作

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
    }
}

你可能感兴趣的:(golang)