go语言文件读写

74 阅读2分钟

读文件三种方式

读文件还是很方便的,go语言中直接提供IoUtile包可以直接读取,也可以使用原生代码读取

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

/**
读取文件
 */
func main() {

	fileName := "/Users/pilgrim/Desktop/go/TestDemo/src/file/a.txt";
	str := readFile(fileName)
	fmt.Printf("读取到的文件内容是: \n %s " , str)

	fmt.Println("\n ioUtliRead读取到的文件内容是 " )
	ioUtliRead(fileName)

	fmt.Println("\n ioUtliReadAll 读取到的文件内容是 " )
	ioUtliReadAll(fileName)

}


//缓冲读取
func readFile(fileName string) string{

	var str string

	open, err := os.Open(fileName)
	if err!=nil {

		fmt.Printf("打开文件失败 ",err.Error())
		return ""
	}

	//关闭文件  defer可以延迟关闭
	defer open.Close();


	for {
		tem :=  make([]byte,128,128)
		//读取文件内容
		_, err := open.Read(tem)
		str += string(tem)
		//文件读取结束
		if err == io.EOF {
			fmt.Println("读取结束")
			return str
		}

		if err!=nil {
			fmt.Println("读取失败 ",err.Error())
			return ""
		}

	}

	fmt.Printf("str %s",str)
	return str


}


//使用ioutile 读取
func ioUtliRead(fileName string)  {

	file, err := ioutil.ReadFile(fileName)


	if err != nil {
		fmt.Println(err.Error())
		return
	} else {
		fmt.Println(string(file))
	}

}


//使用 ReadAll 读取
func ioUtliReadAll(fileName string) {

	open, err := os.Open(fileName)
	if err != nil {
		fmt.Printf("打开文件失败 %s", err.Error())
		return

	}

	defer open.Close()
	file, err := ioutil.ReadAll(open)

	if err != nil {
		fmt.Println(err.Error())
		return
	} else {
		fmt.Println(string(file))
	}

}




//按行读取

func readByLine(fileName string)  {

	open, err := os.Open(fileName)
	if err != nil {
		fmt.Printf("打开文件失败 %s", err.Error())
		return

	}
	defer open.Close()

	reader:=bufio.NewReader(open) //带缓冲区的读写
	for  {
		str,err:=reader.ReadString('\n') //循环读取一行

		if err==io.EOF {
			fmt.Printf("读取的每行内容  : %s ",str)
			fmt.Println("读取结束")
			return
		}
		if err!=nil {
			fmt.Println("读取错误 : %s",err.Error())
			return
		}
		fmt.Printf("读取的每行内容  : %s",str)
		
	}


}

写文件操作go语言也提供了一个util可以直接写
也可以使用原生的api操作

需要注意的是写文件需要提供文件操作权限,需要指定对文件的只读只写等
下图为源码 指定file flag
在这里插入图片描述
注释

const (
O_RDONLY int = syscall.O_RDONLY //只读模式打开文件
O_WRONLY int = syscall.O_WRONLY //只写模式打开文件
O_RDWR int = syscall.O_RDWR //读写模式打开文件
O_APPEND int = syscall.O_APPEND //写操作时将数据附加到文件尾部
O_CREATE int = syscall.O_CREAT //如果不存在将创建一个新文件
O_EXCL int = syscall.O_EXCL //和O_CREATE配合使用,文件必须不存在
O_SYNC int = syscall.O_SYNC //打开文件用于同步I/O
O_TRUNC int = syscall.O_TRUNC //如果可能,打开时清空文件
)

package main

import (
	"fmt"
	"os"
)

func main() {


	fileName := "./src/file/wirter/b.txt"

	file, err := os.OpenFile(fileName,os.O_APPEND|os.O_CREATE|os.O_WRONLY,0755)
	if err!=nil {
		return
	}
	file.Write([]byte("我是内容1 \n"))
	file.WriteString("我是内容2")
	file.Fd()
	file.Close()


	//读取
	readFile, err := os.ReadFile(fileName)
	fmt.Println(string(readFile))

	//源码默认会清空
	//f, err := OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm)
	err = os.WriteFile(fileName, []byte("写入内容123456789"), 0755)
	if err==nil {
		fmt.Println("写入成功")

	}else{
		fmt.Printf("写入失败 %s ",err)

	}


	//读取
	r, err := os.ReadFile(fileName)
	fmt.Println(string(r))

}



//缓冲区写入
func write(fileName string) {
	file,err:=os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY,0755)
	if err!=nil {
		fmt.Println("error",err)
		os.Exit(1)
	}
	defer file.Close()

	fileWrite:=bufio.NewWriter(file)
	fileString:="小王啊\n"
	for i := 0; i<10; i++ {
		fileWrite.WriteString(fileString)
	}
	fileWrite.Flush() //将缓冲中的数据写入下层的io.Writer接口(Flush方法)
}