Go 文件操作(上)

打开文件和关闭文件

  • 打开:os.Open()
  • 关闭:fileObj.Close()
func f1(){
    filObj, err := os.Open("./main.go")
    if err != nil{
        fmt.Printf("open file failed,err:%V",err)
        return
    }
    defer fileObj.Close()
}

读文件

方法一:file.Read()

fileObj.Read([]byte)(n int, err error)
//返回数据:
//n:当次读取读了多少字节的数据
//err: 错误信息

完整示例代码:

package main  //定义main包
// 导入相关包
import (
	"fmt"
	"os"
)
// 读写文件的操作
func f1() {
	//用file.Read()来实现读文件
	path := "./main.go"        //文件路
	file, err := os.Open(path) // 打开文件
	if err != nil {            //判断打开文件有没有出错
		fmt.Println("文件打开出错,err:", err)
		return
	}
	//函数结束时关闭文件句柄.用defer语句是为了怕代码过长,当对文件操作进行完时忘记关闭文件.养成打开与关闭联动的习惯
	defer file.Close()

	content := make([]byte, 128) //定义一个128长度的byte类型的切片
	for {
		n, err := file.Read(content)  //读取文件

		if err != nil {  //判断读取文件有没有出错
			fmt.Println("文件读取出错,err:", err)
			return
		}
		fmt.Printf("读取了%d个字节\n", n)
		fmt.Println(string(content[:n]))

		if n < 128 {  
			// 判断文件有没有读取完.这样写,还是有小概率会出错.就是上一次刚好读取完了所有的数据,文件已经EOF了
			// 可以在每次读取完成判断err == io.EOF, 如果是,说明已经读完了
			return
		}
	}
}
// 主函数
func main() {
	// 调用第一种读文件的方法
	f1()

}

方法二bufio包

包: bufio
先创建一个读取器br := bufio(file)
再用读取器读取文件内容,按行读取
content, err := br.ReadString('\n')  //注意参数是'\n

完整示例

package main  //定义main包
// 导入相关包
import (
	"fmt"
	"os"
	"bufio"
)

// bufio
func f2(){
	//用file.Read()来实现读文件
	path := "./main.go"        //文件路
	file, err := os.Open(path) // 打开文件
	if err != nil {            //判断打开文件有没有出错
		fmt.Println("文件打开出错,err:", err)
		return
	}
	//函数结束时关闭文件句柄.用defer语句是为了怕代码过长,当对文件操作进行完时忘记关闭文件.养成打开与关闭联动的习惯
	defer file.Close()
	br := bufio.NewReader(file)
	for {
		content, err := br.ReadString('\n')  // 按行读取文件内容

		if err != nil{
			fmt.Printf("文件读取出错,err:%v",err)
			return
		}
		fmt.Print(content)
	}
}
// 主函数
func main() {
	// 调用第一种读文件的方法
	f2()

}

方法三:ioutil

ioutil.ReadFile(filepath)(b []byte, err error)

用此方法读取的文件内容:

  1. 是byte的切片
  2. 全文件读取
  3. 如果是纯文本文件的.

案例代码

func f3() {
	b, err := ioutil.ReadFile("./main.go")
	if err != nil {
		fmt.Print(err)
	}
	fmt.Println(b)
	str := string(b)
	fmt.Println(str)
}

// 主函数
func main() {
	// 调用第一种读文件的方法
	f3()
	a, err := fmt.Scanln()

	fmt.Println(a, err)
}

后记:

文件操作是我们经常要用到的.
有三种不同的操作方法.
需要根据不同的需求,选择不同的方法