Go语言文件读写操作案例详解

2022-09-25 17:06:16
目录
基本介绍文件基本操作读操作写操作写操作案例查看文件或目录是否存在拷贝文件

基本介绍

文件,对我们并不陌生,文件是数据源(保存数据的地方)的>

输入流和输出流 文件在程序中是以流的形式来操作的

流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从文件到内存的路径 输出流:数据从内存到文件的路径

    os.File封装所有文件相关操作,File是一个结构体

    文件基本操作

    读操作

    package main
    import (
    	"bufio"
    	"fmt"
    	"io"
    	"io/ioutil"
    	"mahonia"
    	"os"
    )
    func main() {
    	//防止控制台中文乱码 如果是Golang编译则需要安装第三方转码包git clone https://github.com/axgle/mahonia.git
    	var enc mahonia.Decoder
    	enc = mahonia.NewDecoder("gbk")
    	//读取文件的内容并显示在终端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
    	//打开文件 file,err:=os.Open(文件的绝对路径)
    	file,err:=os.Open("F:/test.txt")
    	if err !=nil{
    		fmt.Println("open file err=",err)
    	}
    	//关闭文件
    	defer file.Close()  //要及时关闭文件,否则会有内存泄露
    	//创建一个"Reader",带缓存 默认缓存大小为4096 reader:=bufio.NewReader(file)
    	reader:=bufio.NewReader(file)
    	//读取文件的内容
    	for{
    		str,err:=reader.ReadString('\n')
    		fmt.Print(enc.ConvertString(str))
    		/*
    			你好啊
    			真的很好asdb
    			123
    		*/
    		if err ==io.EOF{// 文件末尾
    			break
    		}
    	}
    	//一次性读取文件内容,适用于文件较小的    无需开启和关闭文件
    	// 使用 ioutil.ReadFile content为byte[]
    	content,err:=ioutil.ReadFile("f:/test.txt")
    	if err!=nil{
    		fmt.Println("read file err=",err)
    	}
    	fmt.Print(enc.ConvertString(string(content)))
    	/*
    	你好啊
    	真的很好asdb
    	123
    	*/
    }
    

    写操作

    文件打开函数>

    package main
    import (
    	"bufio"
    	"fmt"
    	"io"
    	"io/ioutil"
    	"mahonia"
    	"os"
    )
    func main() {
    	//Read1()
    	//Read2("f:/test.txt",'gbk')
    	/*
    	你好啊
    	真的很好asdb
    	123
    	你好啊
    	真的很好asdb
    	123
    	*/
    	//创建一个新文件,写入内容 5句 "hello,Gardon"
    	//Write()
    	//打开一个存在的文件中,将原来的内容覆盖成新的内容10句,"你好,世界!!"
    	//Write2()
    	//打开一个存在的 文件,将原来的内容追加内容"ABC! ENGLISH!"
    	//Write3()
    	//打开一个存在的文件,将原来的内容读出显示在终端,并追加5句"hello,北京"
    	Write4()
    }
    func Read1(){
    	//防止控制台中文乱码 如果是Golang编译则需要安装第三方转码包git clone https://github.com/axgle/mahonia.git
    	var enc mahonia.Decoder
    	enc = mahonia.NewDecoder("gbk")
    	//读取文件的内容并显示在终端,使用os.Open, file.Close, bufio.NewReader(), reader.ReadString
    	//打开文件 file,err:=os.Open(文件的绝对路径)
    	file,err:=os.Open("F:/test.txt")
    	if err !=nil{
    		fmt.Println("open file err=",err)
    	}
    	//关闭文件
    	defer file.Close()  //要及时关闭文件,否则会有内存泄露
    	//创建一个"Reader",带缓存 默认缓存大小为4096 reader:=bufio.NewReader(file)
    	reader:=bufio.NewReader(file)
    	//读取文件的内容
    	for{
    		str,err:=reader.ReadString('\n')
    		fmt.Print(enc.ConvertString(str))
    		/*
    			你好啊
    			真的很好asdb
    			123
    		*/
    		if err ==io.EOF{// 文件末尾
    			break
    		}
    	}
    }
    func Read2(filename string,encode string){
    	var enc mahonia.Decoder
    	enc = mahonia.NewDecoder(encode)
    	//一次性读取文件内容,适用于文件较小的    无需开启和开启文件
    	// 使用 ioutil.ReadFile content为byte[]
    	content,err:=ioutil.ReadFile(filename)
    	if err!=nil{
    		fmt.Println("read file err=",err)
    	}
    	fmt.Print(enc.ConvertString(string(content)))
    }
    func Write(){
    	filename:="f:/test2.txt"
    	//创建文件,并以只写形式打开
    	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_WRONLY,0666)
    	if err !=nil{
    		fmt.Println("open file err=",err)
    		return
    	}
    	defer file.Close()
    	//写入内容
    	str:="hello,Gardon\r\n"
    	//写入时,带有缓存的*Writer
    	writer:=bufio.NewWriter(file)
    	for i:=0;i<5 ;i++  {
    		writer.WriteString(str)
    	}
    	//刷新缓存
    	writer.Flush()
    	//读取文件
    	Read2(filename,"gbk")
    	/*
    	hello,Gardon
    	hello,Gardon
    	hello,Gardon
    	hello,Gardon
    	hello,Gardon
    	*/
    }
    func Write2(){
    	filename:="f:/test2.txt"
    	//创建文件,并以只写形式打开
    	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_TRUNC,0666)
    	if err !=nil{
    		fmt.Println("open file err=",err)
    		return
    	}
    	defer file.Close()
    	//写入内容
    	str:="你好,世界!!\r\n"
    	//写入时,带有缓存的*Writer
    	writer:=bufio.NewWriter(file)
    	for i:=0;i<10 ;i++  {
    		writer.WriteString(str)
    	}
    	//刷新缓存
    	writer.Flush()
    	//读取文件
    	Read2(filename,"utf-8")
    	/*
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    	*/
    }
    func Write3(){
    	filename:="f:/test2.txt"
    	//创建文件,并以只写形式打开
    	file,err:=os.OpenFile(filename,os.O_CREATE |os.O_APPEND,0666)
    	if err !=nil{
    		fmt.Println("open file err=",err)
    		return
    	}
    	defer file.Close()
    	//写入内容
    	str:="ABC! ENGLISH!\r\n"
    	//写入时,带有缓存的*Writer
    	writer:=bufio.NewWriter(file)
    	writer.WriteString(str)
    	//刷新缓存
    	writer.Flush()
    	//读取文件
    	Read2(filename,"utf-8")
    	/*
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		ABC! ENGLISH!
    	*/
    }
    func Write4(){
    	filename:="f:/test2.txt"
    	//创建文件,并以只写形式打开
    	file,err:=os.OpenFile(filename,os.O_RDWR |os.O_APPEND,0666)
    	if err !=nil{
    		fmt.Println("open file err=",err)
    		return
    	}
    	defer file.Close()
    	//追加内容
    	Read2(filename,"utf-8")
    	/*
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	你好,世界!!
    	ABC! ENGLISH!
    	*/
    	str:="hello,北京\r\n"
    	//写入时,带有缓存的*Writer
    	writer:=bufio.NewWriter(file)
    	writer.WriteString(str)
    	//刷新缓存
    	writer.Flush()
    	//读取文件
    	Read2(filename,"utf-8")
    	/*
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		你好,世界!!
    		ABC! ENGLISH!
    		hello,北京
    	*/
    }
    

    写操作案例

    查看文件或目录是否存在

    package main
    import (
    	"fmt"
    	"os"
    )
    func main() {
    	fmt.Println(PathExists("f:/test2.txt")) //true <nil>
    	fmt.Println(PathExists("f:/test3.txt")) //false <nil>
    }
    func PathExists(path string) (bool, error) {
    	_, err := os.Stat(path)
    	//如果返回的错误为nil,说明文件或文件夹存在
    	if err == nil {
    		return true, nil
    	}
    	//如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
    	if os.IsNotExist(err){
    		return false, nil
    	}
    	//如果返回的 错误为其他类型,则不确定是否在存在
    	return false,err
    }
    

    拷贝文件

    package main
    import (
    	"bufio"
    	"fmt"
    	"io"
    	"os"
    )
    func main() {
    	fmt.Println(PathExists("f:/test2.txt")) //true <nil>
    	fmt.Println(PathExists("f:/test3.txt")) //false <nil>
    	written,err:=CopyFile("f:/test3.txt","f:/test2.txt")
    	if err!=nil{
    		fmt.Println("拷贝失败!!")
    	}else{
    		fmt.Println("拷贝成功!!")
    	}
    	fmt.Println(written)
    }
    func PathExists(path string) (bool, error) {
    	_, err := os.Stat(path)
    	//如果返回的错误为nil,说明文件或文件夹存在
    	if err == nil {
    		return true, nil
    	}
    	//如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
    	if os.IsNotExist(err){
    		return false, nil
    	}
    	//如果返回的 错误为其他类型,则不确定是否在存在
    	return false,err
    }
    func CopyFile(writerFileName string,readerFileName string) (written int64,err error){
    	ReaderFile,err2:=os.Open(readerFileName)
    	WriterFlag,_:=PathExists(writerFileName)
    	var WriterFile *os.File
    	if WriterFlag{
    		WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_TRUNC,0666)
    	}else{
    		WriterFile,err=os.OpenFile(writerFileName,os.O_WRONLY |os.O_CREATE,0666)
    	}
    	if err !=nil{
    		fmt.Println("file open err=",err)
    		return
    	}
    	writer:=bufio.NewWriter(WriterFile)
    	defer WriterFile.Close()
    	if err2 !=nil{
    		fmt.Println("file open err=",err2)
    		return
    	}
    	defer ReaderFile.Close()
    	reader:=bufio.NewReader(ReaderFile)
    	return io.Copy(writer,reader)
    }

    以上就是Go语言文件读写操作案例详解的详细内容,更多关于Go语言文件读写操作的资料请关注易采站长站其它相关文章!