文章目录

  • 一. 整个文件读入内存
    • 1.直接指定文化名读取
      • 1.1使用os.ReadFile函数读取文件
      • 1.2使用ioutil.ReadFile函数读取文件
    • 2.先创建句柄再读取
      • 2.1使用os.OpenFile函数只读形式获取句柄
      • 2.2代码讲解
        • 2.2.1os.File结构体
        • 2.2.2os.OpenFile函数
        • 2.2.3io.Reader接口
  • 二.每次只读取一行
    • 1.使用bufio.Reader结构体的ReadBytes方法读取字节数
    • 2.使用bufio.Reader结构体的ReadString方法读取字符串
    • 3.代码讲解
      • 3.1bufio.Reader结构体
  • 三.每次只读取固定字节数
    • 1.使用os库
    • 2.使用 syscall库

一. 整个文件读入内存

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

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))
}

1.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() {/*func Open(name string) (*File, error) {return OpenFile(name, O_RDONLY, 0)}*///Open是一个高级函数,是因为它是只读模式来打开文件/*也可以直接使用 os.OpenFile,只是要多加两个参数file, err := os.OpenFile("a.txt", os.O_RDONLY, 0)*/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.2.1os.File结构体

type File struct {*file // os specific
}

2.2.2os.OpenFile函数

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

2.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)// 创建 Readerfor {//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)}// 创建 Readerr := 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)}// 创建 Readerr := 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.WaitGroupwg.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之读取文件10种的方法相关推荐

  1. 如何找回电脑回收站删除的文件, 10种恢复工具方法!

    你想取回你的回收站删除的文件吗?无论是图像.视频还是文档,我们的设备都会存储所有内容.您可能不小心删除了数据,或者由于其他原因而消失了.要恢复您的文件,您可以访问技术人员或下载任何最好的文件恢复软件. ...

  2. python读取文件的三种方式_python中读取文件的f.seek()方法

    用于二进制文件中 F.seek方法 作用: 设置读写位置 F.seek(偏移量, whence=相对位置) 偏移量 大于0的数代表向文件末尾方向移动的字节数 小于0的数代表向文件头方向中移动的字节数 ...

  3. Python 读取文件四种姿势:实例详解,从此读取文件更得心应手

    Python文件读取的四种方式如下: 1. 逐行读取文件内容 逐行读取文件内容可以使用 for 循环和文件句柄对象,如下所示: with open('file.txt', 'r') as f:for ...

  4. defaultdict python_Python使用defaultdict读取文件各列的方法

    本文实例讲述了Python使用defaultdict读取文件各列的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python """USAGE: pyth ...

  5. 电脑无法启动故障的10种解决方法

    电脑无法启动故障的10种解决方法 开机自检时出现问题后会出现各种各样的英文短句,短句中包含了非常重要的信息,读懂这些信息可以自己解决一些小问题,可是这些英文难倒了一部分朋友,下面是一些常见的BIOS短 ...

  6. win10系统没声音 服务器,win10电脑突然没有声音的10种修复方法

    win10电脑突然没有声音的10种修复方法 发布时间:2020-08-07 05:18:26 来源:ITPUB博客 阅读:140 作者:XINQUDAO 不少用户在面对win10电脑突然没有声音的问题 ...

  7. 下班之后的10种放松方法

    在经历了一天激烈的打拼后,不少职场中人会将工作场所的紧张情绪带回家中,回到家中仍然无法放松.如果发生这种情况,试试以下10种调节方法,它们能够帮助你从办公状态调整到居家状态: 1.将工作留在办公室 下 ...

  8. mac 打开网页慢_在Mac电脑开启Safari速度总是很慢?可以试试这10种解决方法

    Safari身为苹果的当家浏览器自然有它的优势,其中一项就是速度比其他浏览器要快得多(原则上),因此深受Mac用户的喜爱,但也有不少人用了一段时间后感到越来越慢,最后只好抛弃Safari改用Chrom ...

  9. 这10种项目管理方法,PMP项目经理备考收藏

    文章目录 **1. 敏捷开发** **2. Scrum** **3.** **Dev****O****ps** **4.** **Scrumban** **5.** **项目管理的知识体系** **6 ...

最新文章

  1. 涨知识了!网络原来是这样连接的
  2. 2021年机器学习的下一步是什么?
  3. ros控制上网时间,网络定时通断
  4. 微信内测版抢先体验,可发 4K 无损视频
  5. java io密集型任务_Java线程池讲解——针对IO密集型任务
  6. 初识Microsoft Hyper-v Server
  7. 用Jfree实现条形柱状图表,java代码实现
  8. Windows下的包管理工具scoop
  9. 【jvm】java jvm 参数调优 列表
  10. 洛谷2657 windy数(数位DP)
  11. puppet进阶指南——cron资源详解
  12. 如何手动编辑art分区修改qsdk(qca9531、qca9563)无线mac地址
  13. 工商银行接口开发-java
  14. 软件需求,概要设计,详细设计(文档)
  15. js逆向-1 模拟登陆微信公众号平台
  16. javascript中map和filter的区别
  17. 常见电脑故障之网络不通
  18. ceres拟合分段函数
  19. 使用BetterTouchTool自定义你的touchBar
  20. 【评测】MP SARS-CoV-2单抗、重组蛋白

热门文章

  1. 手把手教你设置路由器端口映射
  2. 查看hive的当前参数值
  3. 英语题目作业(12)
  4. 5招教你如何做用户行为分析
  5. postman的命令执行工具--newman
  6. html桌面转手机,教程:让你的手机桌面瞬间高逼格!
  7. HRM认证授权方案_新版
  8. 大国品牌的幕后英雄们
  9. 专访新浪微博黄波:千人千面,机器学习赋能用户信息流消费
  10. 林学与计算机技术,林学訚