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 相关文章推荐
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go 语言结构实例分析
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 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出错界面
2006/10/09 PHP
基于PHP选项与信息函数的使用详解
2013/05/10 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
PHP自定义错误用法示例
2016/09/28 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
JavaScript实现多个重叠层点击切换效果的方法
2015/04/24 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
loading动画特效小结
2017/01/22 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
Node.js 基础教程之全局对象
2017/08/06 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
python根据出生年份简单计算生肖的方法
2015/03/27 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
中国梦主题教育活动总结
2014/05/05 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang