14.Go语言干货-文件操作

1.打开与关闭文件

1.文件操作使用os包。
2.os.Open()函数打开文件,返回一个*File与一个err
3.使用close()方法能够关闭文件,为了防止忘记关闭文件,通常与defer一起使用。

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("./main.go") // 返回文件句柄与错误信息
	defer file.Close()
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(file) // 返回的是*file
	}
}

2.读取文件

2.1 file.Read()

2.1.1 基本使用

我们先看一下Read()方法的精简源码

func (f *File) Read(b []byte) (n int,err error)

Read 方法传入一个类型为[]byte的参数,返回返回一个int类型的n,与error的err。

实现基本读取文件的思路:
调用os.Open()方法,将文件路径传给Open,返回文件句柄与报错信息(如果没有报错就为nil),定义一个类型为[]type的变量tmp(这个变量很重要,读取到文件信息就保存在里面),文件句柄调用Read()方法传入变量tmp,返回读取的字节数与报错信息。

func fileRead(){
	// 只读的方式打开文件
	file,err := os.Open("文件路径")// 返回文件句柄与报错信息
	if err != nil{
		fmt.Printf("open file failed : %v \n",err)
	}
	defer file.close()

	// 使用Read方法读取文件内容
	var tmp := make([]byte,527) // 将tmp传给Read方法,tmp中保存了读出来的内容
	n,err := file.Read(tmp) // n 表示读取的字节数
	if err == io.EOF {
		fmt.Println("文件读取完成")
		return
	}
	if err != nil {
		fmt.Println("file read faild:",err)
		return
	}
	// 将tmp转化为字符串格式
	fmt.Println(string(tmp[:n]))
}
2.1.2 循环读取文件内容

使用for的死循环

func fileRead() {
	// 只读的方式打开文件
	file, err := os.Open("文件路径") // 返回文件句柄与报错信息
	if err != nil {
		fmt.Printf("open file failed : %v \n", err)
	}
	defer file.Close()

	var content []byte          //content 存储文件中的所有数据
	var tmp = make([]byte, 206) // 将tmp传给Read方法,tmp中保存了读出来的内容
	for {
		// 使用Read方法读取文件内容
		n, err := file.Read(tmp) // n 表示读取的字节数
		if err == io.EOF {
			fmt.Println("文件读取完成")
			break
		}
		if err != nil {
			fmt.Println("file read faild:", err)
			return
		}
		content = append(content, tmp[:n]...)
	}
	fmt.Println(string(content))
}

2.2 bufio 读取文件(一行一行读)

func main() {
	file, err := os.Open("../text")
	if err != nil {
		fmt.Println("file open err", err)
		return
	}
	defer file.Close()
	// 调用bufio的NewReader方法返回reader对象
	reader := bufio.NewReader(file)
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			if len(line) != 0 {
				fmt.Println(line)
			}
			fmt.Println("文件读取完成!")
			break
		}
		if err != nil {
			fmt.Println("read file failed", err)
			return
		}
		fmt.Print(line)
	}
}

2.3 ioutil 读取整个文件

ioutil包下的Readfile方法能够读取整个完整的文件。

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	content, err := ioutil.ReadFile("../text")
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(content))

}

3.文件写入操作

指定文件打开这模式,然后对文件进行相应操作
使用op.OpenFile()方法操作文件

func OpenFile(name string,flag int,perm FileMode)(*file,error){...}

name文件路径 flag 打开文件的模式

模式含义
os.O_WRONLY只写
os.O_CREATE创建文件
os.O_RDONLY只读
os.O_RDWR读写
os.O_TRUNC清空
os.O_APPEND追加

3.1 Write与WriteString

Write:写入字节切片数据
WriteString:直接写入字符串数据

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.OpenFile("./txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
	defer file.Close()
	if err != nil {
		fmt.Println(err)
	}
	content := "荆轲刺秦王2"
	file.Write([]byte(content))//写入字节切片数据
	file.WriteString(content)// 写入字符串数据
}

3.2 bufio.NewWriter

先将数据写入缓存,再将数据写进磁盘

func main() {

	file, err := os.OpenFile("./txt2", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777)
	if err != nil {
		fmt.Println(err)
	}
	writer := bufio.NewWriter(file)
	writer.WriteString("我闪!")
	writer.Flush()
}

3.3 ioutil.WriteFile

func main() {
	str := "hello 沙河"
	err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
	if err != nil {
		fmt.Println("write file failed, err:", err)
		return
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值