golang的文件创建及读写操作


Posted in Golang onApril 14, 2022

三种文件操作比较

ioutil
bufio
os.File

当文件较小(KB 级别)时,ioutil > bufio > os。
当文件大小比较常规(MB 级别)时,三者差别不大,但 bufio 又是已经显现出来。
当文件较大(GB 级别)时,bufio > os > ioutil。

ioutil

ioutil.ReadFile读

//读
func Ioutil_read() {
	file, _ := ioutil.ReadFile("./write.txt")
	fmt.Println(string(file))
}

ioutil.WriteFile 写

//写
func Ioutil_write()  {
	ioutil.WriteFile("./write.txt",[]byte("aaaa\nbbb\ncccc\n啦啦啦啦"),0777)
}

ioutil.ReadAll 读

// 比较浪费内存,解决方法,百度查询
file,_ := os.Open("./write.txt")
b,_:=ioutil.ReadAll(file)
fmt.Println(string(b))

ioutil.ReadDir 查看路径下目录信息

func Ioutil_ReadDir()  {
	dir,_:=ioutil.ReadDir("./")
	for _,file := range dir{
		fmt.Println(file.Name())  //文件名字
		fmt.Println(file.Size())  //文件大小
		fmt.Println(file.IsDir())  //判断是否为目录
		fmt.Println(file.Mode())  //查看读写权限-rw-r--r--
		fmt.Println(file.ModTime())  //文件创建时间
	}
}

ioutil.TempDir 创建临时目录

// 创建临时目录,以jeff开头,eg:jeff0123755
func Ioutil_Tempdir()  {
	path,_ := ioutil.TempDir("./","jeff")
	fmt.Println(path)  //返回临时目录路径
}

ioutil.TempFile 创建临时文件

// 创建临时文件,以jeff开头,eg:jeff067576
func Ioutil_file()  {
	//以读写模式打开该文件并返回os.File指针
	path,_:=ioutil.TempFile("./","jeff")
	fmt.Println(path) //返回os.File指针
}

os.file

方法

os.Create() //创建文件,如果有该文件则会清空文件
os.Open()  // 只读方式打开文件
os.OpenFile(文件名,打开方式,打开权限)
Write() //写入
Read()  //读取

os.OpenFile()

OpenFile( )这个函数有三个参数,第一个参数表示打开文件的路径,第二个参数表示模式,常见的模式有

O_RDONLY(只读模式),O_WRONLY(只写模式),O_RDWR(可读可写模式),O_APPEND(追加模式)。

第三个参数,表示权限,取值范围(0-7)
表示如下:

0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限
fp,err := os.OpenFile("D:/a.txt",os.O_RDWR,6)
if err!=nil {
    fmt.Println("打开文件失败")
}

fp.WriteString("hello")
fp.WriteAt([]byte("hello"),25)
defer fp.Close()

创建文件

将数据存储到文件之前,先要创建文件。GO语言中提供了一个Create( )函数专门创建文件.

该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。

同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。

创建文件的步骤:

(1)导入“os”包,创建文件,读写文件的函数都在该包

(2)指定创建的文件存放路径以及文件名。

(3)执行Create( )函数,进行文件创建

(4)关闭文件

具体代码:

package main

import (
    "fmt"
    "os"
)

func main() {
    //os.Create(文件名) 文件名  可以写绝对路径和相对路径
    //返回值  文件指针 错误信息
    fp,err := os.Create("./a.txt")
    if err!=nil{
        //文件创建失败
        /*
        1.路径不存在
        2.文件权限
        3.程序打开文件上限
         */
        fmt.Println("文件创建失败")
        return
    }

    //读写文件

    defer fp.Close()

    //关闭文件
    //如果打开文件不关闭 造成内存的浪费  程序打开文件的上限
    //fp.Close()
}

写入数据三种方式

第一种-WriteString( )函数

WriteString( )方法默认返回两个参数,第一个参数,指的是写入文件的数据长度,第二个参数记录的是错误信息
WriteString( )方法默认写到文件中的数据是不换行的。如果想换行,可以采用如下的方式:

//\n不会换行  原因 在windows文本文件中换行\r\n  回车  在linux中换行\n
fp.WriteString("hello world\r\n")
fp.WriteString("性感荷官在线发牌")

文件打开以后,可以向文件中写数据,可以使用WriteString( )方法。

//\反斜杠 转义字符
//在写路径时可以使用/正斜杠代替\反斜杠
fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    /*
    1.路径不存在
    2.文件权限
    3.程序打开文件上限
     */
    fmt.Println("文件创建失败")
    return
}

//写文件

//\n不会换行  原因 在windows文本文件中换行\r\n  回车  在linux中换行\n
fp.WriteString("hello world\r\n")
fp.WriteString("性感荷官在线发牌")


defer fp.Close()

//关闭文件
//如果打开文件不关闭 造成内存的浪费  程序打开文件的上限
//fp.Close()

第二种-Write( )函数

在这里要注意的是,使用Write( )函数写数据时,参数为字节切片,所以需要将字符串转换成字节切片。该方法返回的也是写入文件数据的长度
fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    /*
    1.路径不存在
    2.文件权限
    3.程序打开文件上限
     */
    fmt.Println("文件创建失败")
    return
}

//写操作
//slice := []byte{'h','e','l','l','o'}
//count,err1 := fp.Write(slice)
count,err1 := fp.Write([]byte("性感老王在线授课"))

if err1!=nil {
    fmt.Println("写入文件失败")
    return
}else {
    fmt.Println(count)
}

defer fp.Close()

第三种-WriteAt( )函数

在指定的位置写入数据,以下程序中Seek( )函数返回值存储到变量n中,值为文件末尾的位置。WriteAt( )也返回的是写入的数据长度。

fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    /*
    1.路径不存在
    2.文件权限
    3.程序打开文件上限
     */
    fmt.Println("文件创建失败")
    return
}

//写操作
//获取光标流位置'
//获取文件起始到结尾有多少个字符
//count,_:=fp.Seek(0,os.SEEK_END)
count,_:=fp.Seek(0,io.SeekEnd)
fmt.Println(count)
//指定位置写入
fp.WriteAt([]byte("hello world"),count)
fp.WriteAt([]byte("hahaha"),0)
fp.WriteAt([]byte("秀儿"),19)

defer fp.Close()

读取文件

Read 读取文件

如果文件已经存在,并且也已经有数据了,那么可以直接读取该文件中的内容。

读取文件的基本流程如下:

(1)打开要读取的文件

(2)对文件进行读取

(3)关闭文件

在向文件中写数据的时候,使用的是Write,那么读取文件中的数据,使用的是Read.

关于Read( )函数的使用如下:

package main

import (
    "fmt"
    "io"
    "os"
)
func main() {

    //打开文件
    fp, err := os.Open("D:/a.txt")
    if err != nil {
        fmt.Println("err=", err)
        return
    }

    buf := make([]byte, 1024*2) //2k大小
    //n代表从文件读取内容的长度
    n, err1 := fp.Read(buf)
    if err1 != nil && err1 != io.EOF {
        fmt.Println("err1=", err1)
        return
    }
    fmt.Println("buf=", string(buf[:n]))

    //关闭文件
    defer fp.Close()

}

Open( )是打开文件,与OpenFile( )的区别是,Open( )只有读的权限

在使用Read( )函数读取文件中的内容时,需要一个切片类型,而定义切片时类型为字符数组,将文件中的内容保存在切片中,同时除了对其判断是否出错时以外,还要判断是否到文件末尾(这里需要导入io包)。

Read( )函数返回的是从文件中读取的数据的长度。最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)

按行读取

上面我们是将文件的内容全部读取出来,然后存放在切片中,我们也可以每次只读取一行数据。

这需要用到bufio包中的ReadBytes函数。具体如下:

1:打开文件

fp, err := os.Open("D:/a.txt")
if err != nil {
    fmt.Println("打开文件失败", err)
    return
}

2:创建缓冲区

在使用ReadBytes( )函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。提供缓冲区的原因是:

为了缓和 CPU 与磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。

//创建文件缓冲区
r := bufio.NewReader(fp)

3:循环读取文件中的内容,直到文件末尾位置。

for {
    //遇到'\n'结束读取,但是'\n'也读取进入
    buf,err := r.ReadBytes('\n')
    fmt.Println("buf = ",string(buf))
    if err != nil {
        if err == io.EOF {
            break
        }
        fmt.Println("err=",err)
    }
}

在使用ReadBytes( )函数时,传递的参数是‘\n’,表示遇到’\n’就结束,所以使用了死循环(每循环一次,读取一行数据),只有到文件末尾了,才退出整个循环。最后,将读取的数据打印出来,注意ReadBytes( )返回的是字节切片,所以在打印时要转换成字符串。

4:最后关闭文件

//关闭文件
defer fp.Close()

现在我们已经完成了文件的创建,读取,以及将数据保存到文件的操作,在对文件操作时,我们需要指定文件的路径。

关于路径,有两种情况:

第一:相对路径,所谓相对路径指的是文件相对于应用程序的路径。例如:上面我们一只使用的a.txt,这个文件,该文件存放的位置与可执行文件存储的路径是一样的。

第二:绝对路径:指的是通过给定的这个路径直接能在我的电脑中找到这个文件。例如:D:\Info.txt,

  • 建议我们以后在开发中使用相对路径

文件操作案例

文件拷贝,将已有的文件复制一份,同时重新命名。

基本的思路:

(1)让用户输入要拷贝的文件的名称(源文件)以及目的文件的名称

(2)创建目的文件

(3)打开源文件,并且读取该文件中的内容

(4)将从源文件中读取的内容写到目的文件中。

var srcFileName string
var dstFileName string
fmt.Printf("请输入源文件名称:")
fmt.Scan(&srcFileName)
fmt.Println("请输入目的文件名称:")
fmt.Scan(&dstFileName)
if srcFileName == dstFileName {
    fmt.Println("源文件和目的文件名字不能相同")
    return
}
//只读方式打开源文件
sF,err1 := os.Open(srcFileName)
if err1 != nil {
    fmt.Println("err1=",err1)
    return
}
//新建目的文件
dF,err2 := os.Create(dstFileName)
if err2 != nil{
    fmt.Println("err2=",err2)
    return
}
//操作完毕,需要关闭文件
defer sF.Close()
defer dF.Close()
//核心处理,从源文件读取内容,往目的文件写,读多少写多少
buf := make([]byte,4*1024)//4k大小临时缓冲区
for{
    n,err := sF.Read(buf)//从源文件读取内容,每次读取一部分
    if err != nil{
        fmt.Println("err=",err)
        if err == io.EOF{//文件读取完毕
            break
        }
    }
    //往目的文件写,读多少写多少
    dF.Write(buf[:n])
}

以上就是GO文件创建及读写操作示例详解的详细内容!

Golang 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
golang 实现时间戳和时间的转化
May 07 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Go语言编译原理之源码调试
Aug 05 Golang
golang定时器
Apr 14 #Golang
golang用type-switch判断interface的实际存储类型
Apr 14 #Golang
golang语言指针操作
Apr 14 #Golang
golang使用map实现去除重复数组
Apr 14 #Golang
golang生成并解析JSON
Apr 14 #Golang
Go语言 详解net的tcp服务
Apr 14 #Golang
golang连接MySQl使用sqlx库
Apr 14 #Golang
You might like
PHP三种方式实现链式操作详解
2017/01/21 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
Python3.6正式版新特性预览
2016/12/15 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Python3列表List入门知识附实例
2020/02/09 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
初任培训自我鉴定
2013/10/07 职场文书
医院检讨书范文
2014/02/01 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
研究生简历自我评
2015/03/11 职场文书
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python