Golang基础-6文件

文本文件

目前我们的程序运行了之后结果是保存在内存中,关闭程序或者断电就消失了,往往一些数据是要长期保存的(比如日志信息),这就可以通过文件来存储

创建文件

go语言提供了一个专门的Create()函数来创建文件

image-20220912174509219

创建步骤为:

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

image-20220912180205499

打开文件

用于打开已存在的文件进行系列操作

image-20220912195403625

权限一般使用6,7

image-20220912194130712

func main() {
// 打开文件
f,err := os.OpenFile("./a.txt",os.O_RDWR,6)
// 一般err还是要处理的
if err !=nil{
fmt.Println("打开文件出错:",err)
return
}
//下面对文件的操作省略到写文件处
}

写入文件

image-20220912180901499

在上面代码基础上添加写入操作

// 关闭文件
defer f.Close()
// 写入文件
// 要想再写入文件中换行,要手动通过转义字符\n,但是windows比较特殊,文件中的换行转义字符为\r\n
n, _ := f.WriteString("day5学习GO\r\n")
fmt.Println(n)
// 汉字占了三个字符
n, _ = f.WriteString("文件操作")
fmt.Println(n)

返回值n是单次写入的字符长度image-20220912181933510image-20220912181947899

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()函数(用于设定文件的读写位置)一起使用

image-20220912201601911

负数是向左偏移,正数是向右偏移

首先看一下现在的文件

image-20220912202028693

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

image-20220912202159885

读取文件

文件已经存在要读取里面的内容进行后续操作

image-20220912203011992

读取步骤如下:

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

image-20220912204839756

一般用的较多的是按行读取

image-20220912205009726

通过返回的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()
}

image-20220912210616602

文件操作案例

文件的拷贝

思路:

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

image-20220913170132100

posted @   Ember00  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示