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

相关文章

  • golang 实现时间戳和时间的转化

    golang 实现时间戳和时间的转化

    这篇文章主要介绍了golang 实现时间戳和时间的转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 浅析Go语言中数组的使用

    浅析Go语言中数组的使用

    数组用于在单个变量中存储相同类型的多个值,而不是为每个值声明单独的变量,这篇文章主要为大家介绍了Go语言中数组的简单使用,需要 的可以参考下
    2023-08-08
  • go-micro使用Consul做服务发现的方法和原理解析

    go-micro使用Consul做服务发现的方法和原理解析

    这篇文章主要介绍了go-micro使用Consul做服务发现的方法和原理,这里提供一个通过docker快速安装Consul的方式,当然前提是你得安装了docker,需要的朋友可以参考下
    2022-04-04
  • Go语言变量初始化的实现示例

    Go语言变量初始化的实现示例

    在Go语言中,变量的初始化是编写程序时经常遇到的重要操作之一,本文主要介绍了Go语言变量初始化的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Go中gin框架的*gin.Context参数常见实用方法

    Go中gin框架的*gin.Context参数常见实用方法

    *gin.Context是处理HTTP请求的核心,ctx代表"context"(上下文),它包含了处理请求所需的所有信息和方法,例如请求数据、响应构建器、路由参数等,这篇文章主要介绍了Go中gin框架的*gin.Context参数常见实用方法,需要的朋友可以参考下
    2024-07-07
  • 浅析golang开发Error的使用详解

    浅析golang开发Error的使用详解

    Error是Go语言开发中最基础也是最重要的部分,很多朋友不明白goland error的一些基本使用方法,今天通过本文给大家详细介绍下,需要的朋友参考下吧
    2021-07-07
  • Go 并发读写 sync.map 详细

    Go 并发读写 sync.map 详细

    阅读本文你将会明确 sync.Map 和原生 map +互斥锁/读写锁之间的性能情况。标准库 sync.Map 虽说支持并发读写 map,但更适用于读多写少的场景,因为他写入的性能比较差,使用时要考虑清楚这一点。
    2021-10-10
  • 简单聊聊Go语言中空结构体和空字符串的特殊之处

    简单聊聊Go语言中空结构体和空字符串的特殊之处

    在日常的编程过程中,大家应该经常能遇到各种”空“吧,比如空指针、空结构体、空字符串等,本文就以 Go 语言为例,一起来看看空结构体和空字符串在 Go 语言中的特殊之处吧
    2024-03-03
  • 深入解析Go语言中for循环的写法

    深入解析Go语言中for循环的写法

    这篇文章主要介绍了Go语言中for循环的写法,是Golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Golang实践之Error创建和处理详解

    Golang实践之Error创建和处理详解

    在 C#、Java 等语言中常常使用 try...catch的方式来捕获异常,但是在Golang 对于错误处理有不同的方式,像网上也有很多对 error 处理的最佳实践的文章,其中很多其实就是对 error 的统一封装,使用规范进行约束,本文主要是记录自己对处理 Error 的一些认识和学习
    2023-09-09

最新评论