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

 更新时间:2022年09月23日 14:45:29   作者:山与路  
这篇文章主要为大家介绍了Go语言文件读写操作案例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

基本介绍

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

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

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

  • 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
	*/
}

写操作

文件打开函数 func OpenFile(name string,flag int,perm FileMode)(file *File,err error)

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语言文件读写操作的资料请关注脚本之家其它相关文章!

相关文章

  • 用Go语言标准库实现Web服务之创建路由

    用Go语言标准库实现Web服务之创建路由

    在上一节中创建了项目,这篇文章主要介绍如何用Go语言标准库创建路由,文中有详细的代码示例,对大家的学习或工作有一定的帮助,感兴趣的同学可以参考下
    2023-05-05
  • Go事务中止时是否真的结束事务解析

    Go事务中止时是否真的结束事务解析

    这篇文章主要为大家介绍了Go事务中止时是否真的结束事务实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 解决goland 导入项目后import里的包报红问题

    解决goland 导入项目后import里的包报红问题

    这篇文章主要介绍了解决goland 导入项目后import里的包报红问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言Echo服务器的方法

    Go语言Echo服务器的方法

    这篇文章主要介绍了Go语言Echo服务器的方法,实例分析了Echo服务器的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言常用条件判断空值逻辑的使用

    Go语言常用条件判断空值逻辑的使用

    本文主要介绍了Go语言常用条件判断空值逻辑的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go并发控制WaitGroup的使用场景分析

    Go并发控制WaitGroup的使用场景分析

    WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束,本文通过具体场景结合实际例子给大家介绍使用WaitGroup控制的实现方法,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Golang设计模式中抽象工厂模式详细讲解

    Golang设计模式中抽象工厂模式详细讲解

    抽象工厂模式用于生成产品族的工厂,所生成的对象是有关联的。如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。比如本例子中使用RDB和XML存储订单信息,抽象工厂分别能生成相关的主订单信息和订单详情信息
    2023-01-01
  • Golang 基于flag库实现一个简单命令行工具

    Golang 基于flag库实现一个简单命令行工具

    这篇文章主要介绍了Golang基于flag库实现一个简单命令行工具,Golang标准库中的flag库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具,下文详细介绍。需要的小伙伴可以参考一下
    2022-08-08
  • Go语言包管理模式示例分析

    Go语言包管理模式示例分析

    这篇文章主要为大家介绍了Go语言包管理模式示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go 语言中运行 C程序 代码 

    Go 语言中运行 C程序 代码 

    这篇文章主要介绍了Go 语言中运行 C程序代码,通过直接在 Go 代码中写入 C 程序运行,下面操作过程需要的小伙伴可以参考一下
    2022-03-03

最新评论