Golang基础-6文件
文本文件
目前我们的程序运行了之后结果是保存在内存中,关闭程序或者断电就消失了,往往一些数据是要长期保存的(比如日志信息),这就可以通过文件来存储
创建文件
go语言提供了一个专门的Create()函数来创建文件
创建步骤为:
1.导入os包(含有创建,读写文件的函数)
2.指定创建文件的路径以及文件名
3.执行Create()函数,进行文件创建
4.关闭文件(一般可以在前面加上defer修饰,保证在最后才执行关闭操作)
func main() { // 路径使用可以使用绝对路径(从盘符开始到文件位置Linux以/开始)和相对路径 //绝对路径——"D:/a.txt" f, err := os.Create("./a.txt") if err != nil { fmt.Println("创建失败") return //如果return单独出现在主函数中,表示程序结束 } fmt.Println("创建成功") // 关闭文件 f.Close() }
打开文件
用于打开已存在的文件进行系列操作
权限一般使用6,7
func main() { // 打开文件 f,err := os.OpenFile("./a.txt",os.O_RDWR,6) // 一般err还是要处理的 if err !=nil{ fmt.Println("打开文件出错:",err) return } //下面对文件的操作省略到写文件处 }
写入文件
在上面代码基础上添加写入操作
// 关闭文件 defer f.Close() // 写入文件 // 要想再写入文件中换行,要手动通过转义字符\n,但是windows比较特殊,文件中的换行转义字符为\r\n n, _ := f.WriteString("day5学习GO\r\n") fmt.Println(n) // 汉字占了三个字符 n, _ = f.WriteString("文件操作") fmt.Println(n)
返回值n是单次写入的字符长度
write()函数
b := []byte{'h','e','l','l','o'} n,_ :=f.Write(b)
这种方式我们一般是直接将string类型转换成切片类型来写入,自己写切片一般不使用
var s string ="hello" b := []byte(s) n,_ :=f.Write(b)
WriteAt()
函数一般不用于和创建文件一起使用
一般和打开文件以及seek()函数(用于设定文件的读写位置)一起使用
负数是向左偏移,正数是向右偏移
首先看一下现在的文件
func main() { // 打开文件 f, err := os.OpenFile("./a.txt", os.O_RDWR, 6) // 一般err还是要处理的 if err != nil { fmt.Println("打开文件出错:", err) return } // 设置读写位置是开始往后三个字符,将位置存入r中 r, err := f.Seek(3, 0) if err != nil { fmt.Println("设置读写位置出错:", err) return } b := []byte{'s'} // 在指定位置写入b切片内容会覆盖原位置的数据 f.WriteAt(b, r) }
读取文件
文件已经存在要读取里面的内容进行后续操作
读取步骤如下:
1.打开读取的文件
2.对文件进行读取
3.关闭文件
func main() { // 打开文件 f, err := os.OpenFile("./a.txt", os.O_RDWR, 6) // 一般err还是要处理的 if err != nil { fmt.Println("打开文件出错:", err) return } b := make([]byte, 24) n, err := f.Read(b) if err != nil { fmt.Println("设置读写位置出错:", err) return } fmt.Printf("字符数:%d\t内容:%s\n", n, string(b)) f.Close() }
一般用的较多的是按行读取
通过返回的err为io.EOF
时表示文件读完了
func main() { // 打开文件 f, err := os.OpenFile("./a.txt", os.O_RDWR, 6) // 一般err还是要处理的 if err != nil { fmt.Println("打开文件出错:", err) return } // 创建切片缓冲区 r := bufio.NewReader(f) // 定义读取到回车停止,切割点为回车 b, _ := r.ReadBytes('\n') fmt.Println(string(b)) f.Close() }
文件操作案例
文件的拷贝
思路:
1.让用户输入要拷贝的文件名称,以及目的文件名称
2。创建目的文件
3.打开源文件,并且循环读取每行内容直到结束
4.每读一次将内容写到目的文件中
// 文件拷贝从一个文件复制到另一个文件 func main() { of, err := os.Open("D:/a.jpg") if err != nil { fmt.Println("打开文件失败,err:", err) } nf, err2 := os.Create("D:/b.jpg") if err2 != nil { fmt.Println("创建文件失败,err:", err2) } // 将关闭操作加入栈中,最后执行 defer of.Close() defer nf.Close() // 因为是非文本文件不能用按行读取 b := make([]byte, 1024) for { // 分块读写每个块的大小为1024 n, err := of.Read(b) if err == io.EOF { break } nf.Write(b[:n]) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具