脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go读取文件与写入文件的三种方法操作指南

Go读取文件与写入文件的三种方法操作指南

2022-11-20 14:07心鸽 Golang

在 Go 语言中也经常会遇到操作文件的需求,下面这篇文章主要给大家介绍了关于Go读取文件与写入文件的三种方法操作,文中通过代码介绍的非常详细,需要的朋友可以参考下

打开和关闭文件操作:

os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
    "fmt"
    "os"
)
//文件操作
func main(){
    //打开文件
    file, err := os.Open("./test.txt") //只是用来读的时候,用os.Open。相对路径,针对于同目录下。
    if err != nil{
        fmt.Printf("打开文件失败,err:%v\n",err)
        return
    }
    defer file.Close() //关闭文件,为了避免文件泄露和忘记写关闭文件
}

打开文件读取内容并关闭文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main
 
import (
    "fmt"
    "os"
)
//文件操作
func main(){
    //打开文件
    file, err := os.Open("./test.txt") //只是用来读的时候,用os.Open。相对路径,针对于同目录下。
    if err != nil{
        fmt.Printf("打开文件失败,err:%v\n",err)
        return
    }
    defer file.Close() //关闭文件,为了避免文件泄露和忘记写关闭文件
    //读取文件内容
    var qiepian = make([]byte,128) //做一个大小为128字节的切片
    n, err := file.Read(qiepian) //file.Read里面是一个切片.如果读取成功,那么值声明变量n并同时赋值给n。
    //判断
    if err != nil{ //if err != nil 意思是如果err不为空,那么就说明err有错误值,打印读取错误。如果为空,说明err没有错误值,打印读取成功
        fmt.Printf("读取文件错误,错误值为:%v\n",err)
        return
    }
    fmt.Printf("读取文件成功,文件字节大小为:%d\n",n)
    fmt.Println(string(qiepian))
}

但是如果文件的字节大小大于128呢?

如果文件有1W个字节,但是我们设置的一次只能读取128个,怎么样才能全部读取文件内容?

用循环读取,一次读128,直到读完。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
func readall(){
    //打开文件
    file, err := os.Open("./test.txt") //只是用来读的时候,用os.Open。相对路径,针对于同目录下。
    if err != nil{
        fmt.Printf("打开文件失败,err:%v\n",err)
        return
    }
    defer file.Close() //关闭文件,为了避免文件泄露和忘记写关闭文件
    
    //读取文件内容
    for {
        var qiepian = make([]byte,128) //做一个大小为128字节的切片
        n, err := file.Read(qiepian) //file.Read里面是一个切片.如果读取成功,那么值声明变量n并同时赋值给n。
        if err == io.EOF{ //EOF表示 end of file,就是文件的末尾,这个判断意思就是,读到文件末尾的时候,将当前读了多少字节打印出来并退出
            //把当前读了多少字节的数据打印出来,然后退出
            fmt.Println(string(qiepian))
            return
        }
        //判断
        if err != nil{ //if err != nil 意思是如果err不为空,那么就说明err有错误值,打印读取错误。如果为空,说明err没有错误值,打印读取成功
            fmt.Printf("读取文件错误,错误值为:%v\n",err)
            return
        }
        fmt.Printf("读取文件成功,文件字节大小为:%d\n",n)
        fmt.Println(string(qiepian[:n]))
    }
}
func main(){
    readall()
}

但是这样写,有点太麻烦。

基于此,使用go语言中的内置包,buffio和ioutil来读取

buffio操作:

是在file基础上封装了一层IP。

先把磁盘的内容读到缓冲区,然后再读到代码中去。

写入是先将写入的内容写到缓冲区,然后再写到磁盘中去。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func readBybuffio(){
    //打开文件
    file, err := os.Open("./test.txt") //只是用来读的时候,用os.Open。相对路径,针对于同目录下。
    if err != nil{
        fmt.Printf("打开文件失败,err:%v\n",err)
        return
    }
    defer file.Close() //关闭文件,为了避免文件泄露和忘记写关闭文件
 
    //使用buffio读取文件内容
    reader := bufio.NewReader(file) //创建新的读的对象
    for {
        line , err := reader.ReadString('\n') //注意是字符,换行符。
        if err == io.EOF{
            fmt.Println("文件读完了")
            break
        }
        if err != nil{ //错误处理
            fmt.Printf("读取文件失败,错误为:%v",err)
            return
        }
        fmt.Println(line)
    }  
}
 
func main(){
    readBybuffio()
}

ioutil读取整个文件:

?
1
2
3
4
5
6
7
8
9
//ioutuil
func readByioutil(){
    iot,err := ioutil.ReadFile("./test.txt") //读取文件
    if err != nil{ //做错误判断
        fmt.Printf("读取文件错误,错误为:%v\n",err)
        return
    }
    fmt.Println(string(iot)) //打印文件内容
}

所以我们可以得知,go语言中读取文件的三种方法。

第一种,我们可以使用切片的形式,定制一次读取文件的多少字节并用for循环来读取文件的内容。

第二种,我们可以使用go语言内置的buffio包来一行一行的读取文件的内容。

第三种,我们可以使用go语言内置的ioutil包来读取整个文件的所有内容。

文件写入操作

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

Write和WriteString写入操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main
 
import (
    "fmt"
    "os"
)
 
//文件写入
func write(){
    //os.O_CREATE:创建
    //os.O_WRONLY:只写
    //os.O_APPEND:追加
    //os.O_RDONLY:只读
    //os.O_RDWR:读写
    //os.O_TRUNC:清空
 
    //0644:文件的权限
    //如果没有test.txt这个文件那么就创建,并且对这个文件只进行写和追加内容。
    file,err := os.OpenFile("./test.txt",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0644)
    if err != nil{
        fmt.Printf("文件错误,错误为:%v\n",err)
        return
    }
    defer file.Close()
    str := "你好啊\n"
    file.Write([]byte(str)) //将str字符串的内容写到文件中,强制转换为byte,因为Write接收的是byte。
    file.WriteString("Hello") //写字符串
}
func main(){
    write()
}

使用buffio内置包来读文件

bufio.NewWriter: 先往缓冲区写,然后才写到磁盘中去。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func buffiowrite(){
    file,err := os.OpenFile("./gch.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
    if err != nil{
        fmt.Printf("打开文件失败,错误为:%v\n",err)
        return
    }
    defer file.Close() //关闭文件
    
    writer := bufio.NewWriter(file) //往文件里面写入内容,得到了一个writer对象
    for i := 0; i <10; i++ { //循环写入10行
        writer.WriteString("test\n") //将数据写入缓存
    }
    writer.Flush() //将缓存中内容的写入文件
}

第三种写入文件方法:ioutil.WriteFile

?
1
2
3
4
5
6
7
8
func ioutilWrite(){
    str := "Hello Golang!"
    err := ioutil.WriteFile("./ioutil.txt",[]byte(str),0664)//接收文件名,字节类型的数据,文件的权限
    if err != nil{
        fmt.Printf("打开文件失败,错误为:%v\n",err)
        return
    }
}

总结

到此这篇关于Go读取文件与写入文件的三种方法操作的文章就介绍到这了,更多相关Go读取文件与写入文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/lvjie13450/article/details/121855625

延伸 · 阅读

精彩推荐
  • GolangGo秒爬博客园100页新闻

    Go秒爬博客园100页新闻

    利用go语言的协程并发优势爬取网页速度相当之快,博客园100页新闻标题只需一秒即可全部爬取,跟着小编一起去看看如何实现的,希望大家可以从中受益...

    大囚长5272020-05-19
  • GolangGo语言生成随机数的方法

    Go语言生成随机数的方法

    这篇文章主要介绍了Go语言生成随机数的方法,实例分析了Go语言生成随机数的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    不吃皮蛋3432020-04-14
  • GolangGOLANG使用Context实现传值、超时和取消的方法

    GOLANG使用Context实现传值、超时和取消的方法

    这篇文章主要介绍了GOLANG使用Context实现传值、超时和取消的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    winlin8442020-05-22
  • Golanggolang time包做时间转换操作

    golang time包做时间转换操作

    这篇文章主要介绍了golang time包做时间转换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    weixin_415714496372021-03-12
  • GolangGo语言中嵌入C语言的方法

    Go语言中嵌入C语言的方法

    这篇文章主要介绍了Go语言中嵌入C语言的方法,实例分析了Go语言中cgo工具的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    Go语言编程实例7592020-04-18
  • GolangGo利用反射reflect实现获取接口变量信息

    Go利用反射reflect实现获取接口变量信息

    反射是通过实体对象获取反射对象(Value、Type),然后可以操作相应的方法。本文将利用Go语言中的反射reflect实现获取接口变量信息,需要的可以参考一下...

    starine8412022-10-11
  • GolangGo gRPC教程实现Simple RPC

    Go gRPC教程实现Simple RPC

    这篇文章主要为大家介绍了Go gRPC教程实现Simple RPC示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    烟花易冷人憔悴7332022-10-20
  • Golang对Go语言中的context包源码分析

    对Go语言中的context包源码分析

    这篇文章主要对Go语言中的context包源码进行分析,context包析是1.15,context包定义了一个Context类型过这个Context接口类型, 就可以跨api边界/跨进程传递一些值...

    zwf1930716562022-09-02