当前位置: 首页 > news >正文

go读取文件的几种方法

一. 整个文件读入内存

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

1.直接指定文化名读取

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

1.1使用os.ReadFile函数读取文件

package mainimport ("fmt""os"
)func main() {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))
}

2.先创建句柄再读取

2.1使用os.OpenFile函数只读形式获取句柄

package mainimport (
"os"
"io/ioutil"
"fmt"
)func main() {file, err := os.Open("a.txt")if err != nil {panic(err)}defer file.Close()content, err := ioutil.ReadAll(file)fmt.Println(string(content))
}

二.每次只读取一行

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

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

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

每次仅读取一行数据,可以解决内存占用过大的问题,但要注意的是,并不是所有的文件都有换行符 \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()
}

相关文章:

go读取文件的几种方法

一. 整个文件读入内存 直接将数据直接读取入内存&#xff0c;是效率最高的一种方式&#xff0c;但此种方式&#xff0c;仅适用于小文件&#xff0c;对于大文件&#xff0c;则不适合&#xff0c;因为比较浪费内存 1.直接指定文化名读取 在 Go 1.16 开始&#xff0c;ioutil.Rea…...

ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高

近年来&#xff0c;人工智能在医疗领域的应用逐渐增多&#xff0c;其中自然语言处理模型如ChatGPT在提供医疗建议和信息方面引起了广泛关注。然而&#xff0c;最新的研究表明&#xff0c;尽管ChatGPT在许多领域取得了成功&#xff0c;但它在癌症治疗方案上的准确性仍有待提高。…...

docker打包vue vite前端项目

打包vue vite 前端项目 1.打包时将测试删除 2.修改配置 3.打包项目 npm run build 显示成功&#xff08;黄的也不知道是啥&#xff09; 打包好的前端文件放入 4.配置 default.conf upstream wms-app {server 你自己的ip加端口 ;server 192.168.xx.xx:8080 ; } server { …...

zookeeper 查询注册的 dubbo 服务

1. 连接zookeeper 服务端 使用bin 目录下zk客户端连接服务器&#xff0c; ./zkCli.sh -server 127.0.0.1:2181 2. 查询Dubbo 服务 # 查询所有服务 ls /dubbo # 查询指定服务调用 ls /dubbo/服务名(接口地址)/consumers # 查询指定服务调用 ls /dubbo/服务名(接口地址)/pr…...

【每日一题】57. 插入区间

【每日一题】57. 插入区间 57. 插入区间题目描述解题思路 57. 插入区间 题目描述 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可…...

youtubu视频下载和yt-dlp 使用教程

参考&#xff1a;https://zhuanlan.zhihu.com/p/618467617&#xff0c;使用 yt-dlp 下载 youtube 视频的一点体会 安装yt-dlp 1. 安装Python和ffmpeg Python&#xff1a;安装时把pip和添加系统环境变量都选上 ffmpeg&#xff1a;下载好exe文件&#xff0c;把目录添加到系统环…...

——滑动窗口

滑动窗口 所谓滑动窗口&#xff0c;就是不断的调节子序列的起始位置和终止位置&#xff0c;从而得出我们要想的结果。也可以理解为一种双指针的做法。 leetcode76 class Solution {public String minWindow(String s, String t) {char[] schars s.toCharArray();char[] tc…...

【C++进阶】模板进阶

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

Vim如何清空文件

在Vim中&#xff0c;可以使用以下命令清空文件内容&#xff1a; 打开需要清空的文件&#xff1a;在终端中输入vim filename打开文件&#xff0c;其中filename是你要编辑的文件名。 进入命令模式&#xff1a;按下键盘上的Esc键&#xff0c;确保处于Vim的命令模式。&#xff08;…...

问道管理:什么信号?煤飞色舞钢花溅

近期重磅利好不断&#xff0c;对应到A股商场&#xff0c;究竟哪个板块最获益&#xff0c;商场讨论热烈。 地产分析师&#xff1a;方针力度超预期&#xff0c;主张加仓。 银行分析师&#xff1a;存量房贷对银行股心情上的压制完毕&#xff0c;值得重视。 消费分析师&#xff…...

C# PaddleDetection yolo 印章检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq…...

常用框架分析(7)-Flutter

框架分析&#xff08;7&#xff09;-Flutter 专栏介绍Flutter核心思想Flutter的特点快速开发跨平台高性能美观的用户界面 Flutter的架构框架层引擎层平台层 开发过程使用Dart语言编写代码编译成原生代码热重载工具和插件 优缺点优点跨平台开发高性能美观的用户界面热重载强大的…...

清空 Docker 容器的日志文件

删除容器中netcore控制台存储到docker日志记录 在shell命令下执行如下语句&#xff1a; docker ps -aq | xargs docker inspect --format{{.LogPath}} | xargs truncate -s 0 这个命令会执行以下操作&#xff1a; docker ps -aq&#xff1a;列出所有容器的ID&#xff08;包括…...

01-虚拟机安装Windows Server操作系统

1、创建并配置虚拟机 2、安装操作系统 找到windows Server镜像 等待安装 3、设置密码...

应用案例 | 基于三维机器视觉的机器人麻袋拆垛应用解决方案

​Part.1 项目背景 在现代物流和制造行业中&#xff0c;麻袋的拆垛操作是一个重要且频繁的任务。传统的麻袋拆垛工作通常由人工完成&#xff0c;分拣效率较低&#xff0c;人力成本较高&#xff0c;现场麻袋堆叠、变形严重&#xff0c;垛型不规则、不固定&#xff0c;严重影响分…...

1018 Public Bike Management 结题记录(dfs剪枝)

个人觉得直接放入代码是最管用的。 其他方法类似&#xff0c;题意请参考其他博主。 #include <bits/stdc.h> using namespace std; const int N 1e4 50;int maxn 2000000000; int c, n, ed, s[N], m, minlen, needn, backn, pre[N]; bool flag, book[N]; vector<p…...

C++ deque底层原理

deque底层原理 一、目的二、底层实现三、原理图四、类结构五、push_back六、pop_back 一、目的 实现双端数组 二、底层实现 双向开口的连续线性空间 三、原理图 四、类结构 class deque : protected Deque base _Deque_base._Deque_impl M_map 指针数组 _M_map_size …...

打破对ChatGPT的依赖以及如何应对ChatGPT的错误和幻觉

​ OpenAI的ChatGPT是第一个真正流行的生成式AI工具&#xff0c;但它可能不是最好的。现在是时候扩大你的AI视野了。 ChatGPT成为了基于大语言模型(LLM)的聊天机器人的同义词。但是现在是时候停止对ChatGPT的痴迷&#xff0c;开始发现这个新世界中强大的替代品了。 首先&a…...

【git】【IDEA】在idea中使用git

目录 一、 在IDEA中配置git 二、 获取git仓库 2.1 本次初始化仓库 2.2 从远程仓库克隆 三、 本地仓库操作 3.1 将文件加入暂存区 3.2 将暂存区的文件提交到版本库 3.3 快捷键 使用快捷键 实现加入到暂存区与提交到版本库 3.4 查看日志 Show History 四、 远程仓库操…...

【设计模式】装饰者模式

目录 一、定义二、结构三、优点四、使用场景五、代码示例六、截图示例 一、定义 1.在不改变现有对象结构的情况下&#xff0c;动态给该对象添加额外功能的模式 2.类B继承于类A&#xff0c;并将类A作为B类的属性&#xff08;B类聚合A类&#xff09; 3.BufferedInputStream、Buff…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...