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 @ 2022-09-13 17:47  Ember00  阅读(52)  评论(0)    收藏  举报