iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GoLang读取文件的方法有哪些
  • 584
分享到

GoLang读取文件的方法有哪些

2023-07-02 13:07:19 584人浏览 独家记忆
摘要

这篇文章主要介绍“golang读取文件的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoLang读取文件的方法有哪些”文章能帮助大家解决问题。一. 整个文件读入内存直接将数据直接读取入内

这篇文章主要介绍“golang读取文件的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoLang读取文件的方法有哪些”文章能帮助大家解决问题。

    一. 整个文件读入内存

    直接将数据直接读取入内存,是效率最高的一种方式,但此种方式,仅适用于小文件,对于大文件,则不适合,因为比较浪费内存

    1.直接指定文化名读取

    在 Go 1.16 开始,ioutil.ReadFile 就等价于 os.ReadFile,二者是完全一致的

    1.1使用os.ReadFile函数读取文件
    package mainimport (    "fmt"    "os")func main() {   //func ReadFile(name string) ([]byte, error) {}    content, err := os.ReadFile("a.txt")    if err != nil {        panic(err)    }    fmt.Println(string(content))}

    2使用ioutil.ReadFile函数读取文件

    package mainimport (    "io/ioutil"    "fmt")func main() {    content, err := ioutil.ReadFile("a.txt")    if err != nil {        panic(err)    }    fmt.Println(string(content))}
    // As of Go 1.16, this function simply calls os.ReadFile.func ReadFile(filename string) ([]byte, error) {    return os.ReadFile(filename)}

    2.先创建句柄再读取

    2.1使用os.OpenFile函数只读形式获取句柄
    package mainimport ("os""io/ioutil""fmt")func main() {         //Open是一个高级函数,是因为它是只读模式来打开文件         file, err := os.Open("a.txt")    if err != nil {        panic(err)    }    //func (f *File) Close() error {}    defer file.Close()    //func ReadAll(r io.Reader) ([]byte, error) {}    content, err := ioutil.ReadAll(file)    fmt.Println(string(content))}
    2.2代码讲解

    2.1os.File结构体

    type File struct {*file // os specific}

    2.2os.OpenFile函数

    func OpenFile(name string, flag int, perm FileMode) (    *File,   error) {}

    2.3io.Reader接口

    type Reader interface {Read(p []byte) (n int, err error)}

    二.每次只读取一行

    一次性读取所有的数据,太耗费内存,因此可以指定每次只读取一行数据,方法有三种:

    (1)bufio.读行()

    (2)bufio.读取字节("\n")

    (3)bufio.ReadString(’\n’)

    在 bufio 的源码注释中,曾说道 bufio.ReadLine() 是低级库,不太适合普通用户使用,更推荐用户使用 bufio.ReadBytes和bufio.ReadString 去读取单行数据

    因此,这里不再介绍 bufio.读行()

    1.使用bufio.Reader结构体的ReadBytes方法读取字节数

    ReadBytes读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的切片。如果ReadBytes方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadBytes方法返回的切片不以delim结尾时,会返回一个非nil的错误

    package mainimport (    "bufio"    "fmt"    "io"    "os"    "strings")func main() {    // 创建句柄    fi, err := os.Open("christmas_apple.py")    if err != nil {        panic(err)    }    //func NewReader(rd io.Reader) *Reader {},返回的是bufio.Reader结构体    r := bufio.NewReader(fi)// 创建 Reader    for {    //func (b *Reader) ReadBytes(delim byte) ([]byte, error) {}        lineBytes, err := r.ReadBytes('\n')        //去掉字符串首尾空白字符,返回字符串        line := strings.TrimSpace(string(lineBytes))        if err != nil && err != io.EOF {            panic(err)        }        if err == io.EOF {            break        }        fmt.Println(line)    }}

    2.使用bufio.Reader结构体的ReadString方法读取字符串

    ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误

    package mainimport (    "bufio"    "fmt"    "io"    "os"    "strings")func main() {    // 创建句柄    fi, err := os.Open("a.txt")    if err != nil {        panic(err)    }    // 创建 Reader    r := bufio.NewReader(fi)    for {    //func (b *Reader) ReadString(delim byte) (string, error) {}        line, err := r.ReadString('\n')        line = strings.TrimSpace(line)        if err != nil && err != io.EOF {            panic(err)        }        if err == io.EOF {            break        }        fmt.Println(line)    }}

    3.代码讲解

    3.1bufio.Reader结构体
    type Reader struct {buf          []byterd           io.Reader // reader provided by the clientr, w         int       // buf read and write positionserr          errorlastByte     int // last byte read for UnreadByte; -1 means invalidlastRuneSize int // size of last rune read for UnreadRune; -1 means invalid}

    三.每次只读取固定字节数

    每次仅读取一行数据,可以解决内存占用过大的问题,但要注意的是,并不是所有的文件都有换行符 \n;
    因此对于一些不换行的大文件来说,还得再想想其他办法

    1.使用os库

    通用的做法是:

    先创建一个文件句柄,可以使用 os.Open 或者 os.OpenFile;

    然后 bufio.NewReader 创建一个 Reader;

    然后在 for 循环里调用 Reader 的 Read 函数,每次仅读取固定字节数量的数据

    Read方法读取数据写入p;本方法返回写入p的字节数;本方法一次调用最多会调用下层Reader接口一次Read方法,因此返回值n可能小于len§;读取到达结尾时,返回值n将为0而err将为io.EOF

    package mainimport (    "bufio"    "fmt"    "io"    "os")func main() {    // 创建句柄    fi, err := os.Open("a.txt")    if err != nil {        panic(err)    }    // 创建 Reader    r := bufio.NewReader(fi)    // 每次读取 1024 个字节    buf := make([]byte, 1024)    for {        //func (b *Reader) Read(p []byte) (n int, err error) {}        n, err := r.Read(buf)        if err != nil && err != io.EOF {            panic(err)        }        if n == 0 {            break        }        fmt.Println(string(buf[:n]))    }}

    2.使用 syscall库

    os 库本质上也是调用 syscall 库,但由于 syscall 过于底层,如非特殊需要,一般不会使用 syscall;

    本篇为了内容的完整度,这里也使用 syscall 来举个例子;

    本例中,会每次读取 100 字节的数据,并发送到通道中,由另外一个协程进行读取并打印出来

    package mainimport (    "fmt"    "sync"    "syscall")func main() {    fd, err := syscall.Open("christmas_apple.py", syscall.O_RDONLY, 0)    if err != nil {        fmt.Println("Failed on open: ", err)    }    defer syscall.Close(fd)    var wg sync.WaitGroup    wg.Add(2)    dataChan := make(chan []byte)    go func() {        wg.Done()        for {            data := make([]byte, 100)            n, _ := syscall.Read(fd, data)            if n == 0 {                break            }            dataChan <- data        }        close(dataChan)    }()    go func() {        defer wg.Done()        for {            select {            case data, ok := <-dataChan:                if !ok {                    return                }                fmt.Printf(string(data))            default:            }        }    }()    wg.Wait()}

    关于“GoLang读取文件的方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网GO频道,小编每天都会为大家更新不同的知识点。

    您可能感兴趣的文档:

    --结束END--

    本文标题: GoLang读取文件的方法有哪些

    本文链接: https://www.lsjlt.com/news/342260.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • golang读取文件有哪些方法
      golang读取文件的方法:1、使用os包和os.Open函数;2、使用bufio包和Scanner类型;3、使用ioutil包和ReadFile函数;4、使用os/exec包和命令行工具组合读取文件内容。详细介绍:1、使用os包和os.O...
      99+
      2023-12-14
      Golang
    • GoLang读取文件的方法有哪些
      这篇文章主要介绍“GoLang读取文件的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoLang读取文件的方法有哪些”文章能帮助大家解决问题。一. 整个文件读入内存直接将数据直接读取入内...
      99+
      2023-07-02
    • golang读取文件内容的方法有哪些
      在 Golang 中,我们可以使用以下几种方法来读取文件的内容: 使用 ioutil 包中的 ReadFile 函数:使用 iou...
      99+
      2023-10-20
      golang
    • perl读取文件的方法有哪些
      Perl读取文件的方法有以下几种:1. 使用open函数打开文件,并使用...
      99+
      2023-10-18
      perl
    • Java文件读取的方法有哪些
      今天小编给大家分享一下Java文件读取的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。BufferedReader...
      99+
      2023-07-06
    • nodejs读取文件的方法有哪些
      Node.js中读取文件的方法有以下几种:1. 使用fs模块的fs.readFile()方法:该方法将整个文件读入内存,并在回调函数...
      99+
      2023-08-09
      nodejs
    • java读取文本文件的方法有哪些
      Java读取文本文件的方法有以下几种:1. 使用FileReader和BufferedReader类:使用FileReader类读取...
      99+
      2023-09-20
      Java
    • java读取xml文件的方法有哪些
      Java读取XML文件的方法有以下几种:1. 使用DOM解析器:DOM解析器将整个XML文档加载到内存中,形成一个树形的DOM对象,...
      99+
      2023-09-27
      java
    • php中读取文件的方法有哪些
      这篇文章主要介绍了php中读取文件的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。文件是否可执行:- is executable()文件是否可读...
      99+
      2023-06-15
    • java读取excel文件的方法有哪些
      1. 使用POI库:POI是Apache的一个开源项目,提供了读取、写入和操作Microsoft Office格式文件的Java A...
      99+
      2023-05-29
      java读取excel文件 java
    • shell按行读取文件的方法有哪些
      这篇文章主要介绍“shell按行读取文件的方法有哪些”,在日常操作中,相信很多人在shell按行读取文件的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”shell按行读取文件的方法有哪些”的疑惑有所...
      99+
      2023-06-09
    • php读取文件内容的方法有哪些
      PHP读取文件内容的方法有以下几种:1. file_get_contents():该函数用于将整个文件内容读取到一个字符串中。可以接...
      99+
      2023-09-26
      php
    • SpringBoot读取Yml配置文件的方法有哪些
      这篇“SpringBoot读取Yml配置文件的方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot读...
      99+
      2023-07-05
    • C++读取文件的方式有哪些
      这篇文章主要讲解了“C++读取文件的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++读取文件的方式有哪些”吧!C++可以根据不同的目的来选取文件的读取方式,目前为止学习了C++...
      99+
      2023-07-05
    • GoLang读取文件的10种方法实例
      目录一. 整个文件读入内存1.直接指定文化名读取1.1使用os.ReadFile函数读取文件2.先创建句柄再读取2.1使用os.OpenFile函数只读形式获取句柄2.2代码讲解二....
      99+
      2022-11-13
    • C#读取写入文件的方式有哪些
      这篇“C#读取写入文件的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#读取写入文件的方式有哪些”文章吧。1:二...
      99+
      2023-07-02
    • Go语言读取文件的方式有哪些
      这篇文章主要介绍了Go语言读取文件的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言读取文件的方式有哪些文章都会有所收获,下面我们一起来看看吧。整个文件读取我们可以很容易地一次性读取整个文件并将...
      99+
      2023-07-06
    • python文件读写的方法有哪些
      Python文件读写的方法有以下几种:1. 使用open()函数打开文件,并通过read()方法读取文件内容。```pythonfi...
      99+
      2023-09-13
      python
    • golang中关闭文件的方法有哪些
      这篇文章主要介绍了golang中关闭文件的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang中关闭文件的方法有哪些文章都会有所收获,下面我们一起来看看吧。一、defer语句关闭文件defer语...
      99+
      2023-07-05
    • Golang 实现超大文件读取的两种方法
      Golang超大文件读取的两个方案 流处理方式 分片处理 去年的面试中我被问到超大文件你怎么处理,这个问题确实当时没多想,回来之后仔细研究和讨论了下这个问题,对大文件读取做了一个分析...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作