1. 使用 os.Open(path) 函数和 Read() 方法,os.Open() 函数创建文件句柄,Read() 读取文件内容,path 为需要读取的文件路径,最好传递绝对路径这样不会出现错误,Read() 方法需要传递一个 byte 切片,所以需要声明一个 byte 切片,这里需要注意一下需要设置一下切片的长度,如果没有设置切片长度,官方文档说了最终读取的到切片的 byte 数目会可能会小于 byte 切片长度,没有声明长度最终读取的结果就是0,声明一个切片 data 来记录读取文件的结果(可以阅读官方文档的给出的例子),当读取到文件末尾的时候 Read() 方法返回的结果就是0,所以当 n = 0 的时候直接 break 即可:

package mainimport ("fmt""io""log""os""time"
)func main() {path := "C:\\Users\\Desktop\\data.txt"f, err := os.Open(path)if err != nil {// 打开文件失败log.Fatal(err)}var data []bytebuf := make([]byte, 1024)t1 := time.Now()for {// 将文件中读取的byte存储到buf中n, err := f.Read(buf)if err != nil && err != io.EOF {log.Fatal(err)}if n == 0 {break}// 将读取到的结果追加到data切片中data = append(data, buf[:n]...)}// 将data切片转为字符串即使文件内容// fmt.Println(string(data))t2 := time.Now()// 计算读取文件的耗时fmt.Println(t2.Sub(t1))
}

2. 使用 os.Open() 函数和 bufio 包中的 NewReader() 函数,bufio 包实现了输入输出数据缓存的相关读写操作,调用 bufio 包中的 NewReader() 函数会返回一个大小为新创建的具有 4096 byte的缓冲区的 Reader 结构体指针类型(NewReader() 函数的参数为一个 io.Reader 接口,所以只要是实现了 Reader 接口的 read() 方法就可以传递到 NewReader() 函数,例如还可以传递 os.Stdin 标准输入,可以从标准输入中读取数据),Read() 方法执行一次系统调用读取 4096 byte 大小到缓冲区,此后 Read() 方法都会从缓冲区中读,普通 io 每次读写操作都会执行系统调用,必然会比使用  bufio 中的 Read() 方法慢很多,因为每次系统调用都会从用户态到内核态的切换:

package mainimport ("bufio""fmt""io""log""os""time"
)func main() {path := "C:\\Users\\Desktop\\data.txt"f, err := os.Open(path)if err != nil {fmt.Println("打开文件失败")log.Fatal(err)}// 注意buf不能够声明为没有长度的切片, 例如这样声明: var buf []byte是不可以的, 因为官方文档说了最终返回的字节数目n可能小于len(buf), 所以切片需要长度否则读取不了数据var buf = make([]byte, 4096)var data []bytereader := bufio.NewReader(f)t1 := time.Now()for {n, err := reader.Read(buf)if err != nil && err != io.EOF {log.Fatal(err)}// 文件末尾那么退出if n == 0 {break}// 将读取到的数据追加到data切片中data = append(data, buf[:n]...)}//fmt.Println(string(data))t2 := time.Now()fmt.Println(t2.Sub(t1))
}

3. os.Open() 函数 ioutil.ReadAll() 函数:

package mainimport ("fmt""io/ioutil""log""os""time"
)func main() {t1 := time.Now()path := "C:\\Users\\Desktop\\data.txt"fi, _ := os.Open(path)_, err := ioutil.ReadAll(fi)if err != nil {log.Fatal(err)}t2 := time.Now()fmt.Println(t2.Sub(t1))
}

三种读取文件的方法中第二种和第三种方法的速度是比较快的,第一种会相对比较慢一点,我们可以使用 python 生成一个比较大的 data.txt 文件,然后使用三种读取文件的方法输出每一种方法的耗时:

if __name__ == "__main__":file = open("data.txt", "w")# 将数据写入到文件for i in range(1, 10 ** 6):s = ""for j in range(26):s += chr(97 + j)print(s, file=file)

Go语言读取文件的常用方式相关推荐

  1. 图像处理基础 || (一) python 读取图像的常用方式

    python 读取图像的常用方式 图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取.显示与存储,常用的库包括 matplotlib.skimage 和 ...

  2. 用C语言读取文件数据

    使用C语言读取文件数据的示例代码: ```c #include <stdio.h> int main() {     FILE *fp;     char buffer[100]; // ...

  3. c语言读取文件函数,C语言文件操作详细分析:读取文件(fread函数使用)

    C语言文件操作详细分析:读取文件(fread函数使用) 这里详细介绍了C语言读取文件的函数fread的使用说明,参照了MSDN的说明,同时加入自己的经验让大家学的更加明白. C语言读取文件函数frea ...

  4. c语言读取txt第二行数值,c语言读取文件的第二行

    c语言读取文件的第二行 (2012-04-10 00:23:55) 标签: c语言 二 杂谈 c语言读取文件的第二行用c语言读取文件的第二行,第三个域的内容 文件内容: abcd 123456 599 ...

  5. c语言读取一行的前几个字符串,c语言读取文件某一列 c语言 读取文件中某一行的前一行...

    各种格式的文件用什么软件打开.$$$TemporaryFile)Q7?5g4U5m&_.@.m;K"S.$$AOS/2club.looaoo.net-s;X'a)B.N,w7\;{9 ...

  6. c语言fscanf读入字符,关于C语言读取文件和fscanf函数-c语言fscanf函数C语言编程语言...

    FILE * pFile = fopen(" 1.txt"," r"); //获取指向文件的指针 char * pBuf; //定义文件指针 fseek(pFi ...

  7. WPS数据清洗+R语言读取文件画频数分布直方图

    R语言是一门好语言,但很多人在读取文件中数据时会遇到问题.比如我遇到的问题就是从文件中读取数据后,数据无法用于画图. 检索了N篇博文(抱歉我实在无法一一列举30+篇博文)后,终于看到曙光,事实告诉我学 ...

  8. C语言读取文件内容,保存到数组里面

    前言 本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出. 另一部分使用C语言编程实现读取文件内 ...

  9. [笔记]Go语言写文件几种方式性能对比

    Go语言中写文件有多种方式,这里进行如下几种方式的速度对比: 打开文件,写入内容,关闭文件.如此重复多次 打开文件,写入内容,defer 关闭文件.如此重复多次 打开文件,重复多次写入内容,defer ...

最新文章

  1. 12c oracle 修改内存_Oracle12c中性能优化功能增强新特性之重大突破——内存列存储新特性...
  2. 机器人 沈为民_会变形的机器人
  3. C++中return语句的用法
  4. mysql php 入门_PHP入门教程之PHP操作MySQL的方法分析
  5. 开发辅助工具Kalman Studio2.0发布,内置基于T4的代码生成器
  6. Quora使用到的技术
  7. 如何从SharePoint Content DB中查询List数据
  8. HDOJ 1420 Prepared for New Acmer(DP)
  9. linux ext4分区无损扩容,linux操作系统无损升级文件系统ext3至ext4--数据盘篇
  10. 《UVM实战》代码示例
  11. idea 中静态图片资源无法导入
  12. Cubase10.5稳定版安装包+安装教程
  13. mysql错误1273_mysql8 参考手册--错误代码1273-1294
  14. 漫谈唯一设备ID,android开发工程师
  15. ZZULIOJ 1055兔子繁殖问题
  16. 前后落差大用什么词语_形容心情落差大的诗词
  17. 安卓手机玩游戏卡顿怎么解决_手机玩游戏的时候卡顿,怎么处理?
  18. Web3 时代 市场营销的变迁
  19. MP2669GR锂电池充电管理芯片
  20. Flutter 音频转码Mp3文件插件

热门文章

  1. Redis的list,set,zset类型应用及排行榜的实现
  2. GPT是什么,GPT-4是什么
  3. 网易 七鱼 面试 java_reactJs微信端接入网易七鱼客服
  4. 女生学计算机和英语教育,计算机专业大学排名,劝女生别学计算机!
  5. SyncNet:基于Latency-Aware 的V2V协同感知
  6. excel中将字符转换为数值
  7. mysql水平分区方案_SQL Server表分区(水平分区及垂直分区)
  8. jackson序列化首字母大写amp;jackson序列化结果字段名重复
  9. linux apache certbot,CA证书和Ingress (5) Amazon Linux Certbot
  10. 今日头条校园招聘历年经典面试题汇总:C++研发岗