【Golang】Go语言Seeker接口与文件断点续传实战

news2024/11/22 18:41:15

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Seeker接口
    • 一、Seeker接口简介
    • 二、Seeker接口的应用场景
    • 三、Seeker接口的使用示例
    • 四、断点续传

Seeker接口

在现代软件开发中,高效的输入输出(I/O)操作是提高程序性能的关键之一。特别是在处理大量数据时,I/O操作的效率直接影响到应用程序的响应速度和用户体验。Go语言标准库中的io包提供了一系列接口,用于处理各种I/O操作,其中Seeker接口在处理大文件或需要随机访问的场景中非常有用。本文将结合具体案例,详细介绍Go语言中io包的Seeker接口的用法。

一、Seeker接口简介

设置光标的位置,通过设置的光标位置来读写文件
用于在数据流中将光标跳转到指定的位置

Seeker接口表示一个定位器,可以用来定位文件或流的位置。其定义如下:

type Seeker interface {  
    Seek(offset int64, whence int) (int64, error)  
}

Seek方法接受两个参数:

offset:相对位移量,表示从起始位置移动的字节数。
whence:起始位置,可以是以下三个常量之一:

  • io.SeekStart:从文件开头开始计算偏移量。
  • io.SeekCurrent:从当前文件指针位置开始计算偏移量。
  • io.SeekEnd:从文件末尾开始计算偏移量(此时offset通常为负数,表示向前移动)。
    在这里插入图片描述

Seek方法返回两个值:

  • position:移动后的文件指针位置(相对于文件开头的字节数)。
  • err:可能发生的错误。

二、Seeker接口的应用场景

随机访问大文件:对于非常大的文件,通过Seek方法可以直接定位到文件的任意位置进行读写操作,而不需要从头开始遍历文件。
断点续传:在网络传输或文件复制等场景中,如果传输过程中断,可以通过Seek方法定位到上次传输的断点,继续传输剩余的数据。
日志文件分析:对于包含多条记录的日志文件,可以通过Seek方法快速定位到特定记录的位置,进行日志分析或错误排查。

三、Seeker接口的使用示例

以下是一个结合具体案例的示例代码,展示了如何使用Seeker接口来定位文件位置并进行读写操作。
File对象实现了Seeker接口
在这里插入图片描述

file对象可以直接调用Seek方法
我们先看下a.txt文件
在这里插入图片描述

代码示例:

package main

import (
    "fmt"
    "io"
    "os"
)

func main() {
    // 读取文件
    file, _ := os.OpenFile("F:\\goworks\\src\\jingtian\\yufa\\io操作\\a.txt", os.O_RDWR, os.ModePerm)
    // defer close
    defer file.Close()

    // 测试seek
    // 相对开始位置。io.SeekStart
    // 相对于文件末尾, io.SeekEnd
    // func (f *File) Seek(offset int64, whence int) (ret int64, err error)
    //相对于开始位置,光标偏移两个字节
    file.Seek(2, io.SeekStart)
    //创建一个字节的buffer
    buf := []byte{0}
    file.Read(buf)

    fmt.Println(string(buf)) // n

    //Read读了一个字节, 光标现在在3这个位置
    // 相对于当前位置
    file.Seek(3, io.SeekCurrent)
    file.Read(buf)

    fmt.Println(string(buf)) // a

    // 在结尾追加内容
    //相对于结束位置偏移0,光标就设在了结束位置
    file.Seek(0, io.SeekEnd)
    //写入内容
    file.WriteString("hahahaha")
}

运行
在这里插入图片描述

再看下a.txt,可见在末尾写入了我们指定的内容
在这里插入图片描述

四、断点续传

断点续传是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传或者下载未完成的部分,而没有必要从头开始上传或者下载。

go语言实现断点续传的思路:
使用临时文件记录中断位置.
1.文件上传时,先创建上传一个新的文件
2.创建记录中断位置的临时文件,需要记住上一次传递了多少数据、temp.txt
3.设置文件读写偏移量,如果被暂停或者中断了,我们就可以读取这个temp.txt的记录,恢复上传
4.上传完成后,删除临时文件
在这里插入图片描述

package main

import (
    "fmt"
    "io"
    "os"
    "strconv"
)

// 断点续传
func main() {

    // 传输源文件地址
    srcFile := "D:\\downloads\\mingw.7z"
    // 传输的目标位置
    destFile := "F:\\goworks\\src\\jingtian\\yufa\\io操作\\server\\mingw.7z"
    // 临时记录文件
    tempFile := "F:\\goworks\\src\\jingtian\\yufa\\io操作\\temp.txt"

    // 创建对应的file对象,连接起来
    file1, _ := os.Open(srcFile)
    file2, _ := os.OpenFile(destFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
    file3, _ := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm)
    defer file1.Close()
    defer file2.Close()
    fmt.Println("file1/2/3 文件连接建立完毕")

    // 1、读取temp.txt
    file3.Seek(0, io.SeekStart)
    buf := make([]byte, 1024)
    n, _ := file3.Read(buf) //这里的n是读取file3中的字符的个数,比如1024,得到的n是4.所以要借助string转
    //查看返回的n的数据类型
    fmt.Printf("查看n的数据类型%T\n", n)
    fmt.Println("n的值为", n)

    // 2、先转换成string,然后再转换成数字。
    countStr := string(buf[:n])
    count, _ := strconv.ParseInt(countStr, 10, 64)
    fmt.Println("temp.txt中记录的值为:", count) // 5120

    // 3、设置读写的偏移量,offset是int64数据类型
    file1.Seek(count, io.SeekStart)
    file2.Seek(count, io.SeekStart)
    fmt.Println("file1/2 光标已经移动到了目标位置")

    // 4、开始读写(复制、上传)
    bufData := make([]byte, 1024)
    // 5、需要记录读取了多少个字节
    total := int(count)

    for {
        fmt.Println("传输了,", total)
        // 读取数据
        readNum, err := file1.Read(bufData)
        if err == io.EOF || readNum == 0 { // file1 读取完毕了
            fmt.Println("文件传输完毕了")
            //上传完文件再关闭临时文件file3
            file3.Close()
            os.Remove(tempFile)
            break
        }

        // 向目标文件中写入数据,返回写的字节数和错误
        writeNum, err := file2.Write(bufData[:readNum])

        // 将写入数据放到 total中, 在这里total 就是传输的进度
        total = total + writeNum

        // temp.txt 存放临时记录数据
        file3.Seek(0, io.SeekStart) // 将光标重置到开头
        //将数字转换成字符串写入,这里total逐渐变大不存在覆盖不完的问题。如果存在覆盖不完问题,使用os.Truncate(fileName, 0)来清空文件内容
        // os.Truncate(fileName, 0) 截取指定长度字节的内容,其余内容会被删除
        file3.WriteString(strconv.Itoa(total))

        //模拟断电
        //if total > 10000 {
        //    panic("断电了")
        //}

    }

}

在这里插入图片描述

模拟传输过程中出现问题,比如断电
在这里插入图片描述

恢复电后继续上传
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubelet PLEG 实现

概述 kubelet的主要作用是确保pod状态和podspec保持一致,这里的pod状态包括pod中的container状态,个数等。 为了达到这个目的,kubelet需要从多个来源watch pod spec的变化,并周期从container runtime获取最新的container状态。比如…

【Linux:线程锁】

目录 锁的接口: ​编辑 关于锁的几个问题: 从底层实现理解锁: 锁的接口: pthread_mutex_lock函数申请锁成功后,会返回,申请失败,函数不返回,继续申请,线程阻塞pthrea…

python33_数字格式化

数字格式化 数字格式输出说明3.1415926{:.2f}3.14保留小数点后两位3.1415926{:.2f}3.14带符号保留小数点后2位3.1415926{:.0f}3不带小数&#xff0c;但是会四舍五入5{:0>2d}05数字补0&#xff0c;填充左边&#xff0c;宽度为25{:x<4d}5xxx数字补x&#xff0c;填充右边&a…

IPv6 DAD和地址解析实验

实验目的 1、 观察并分析IPv6 DAD过程 2、 观察并分析IPv6地址解析过程 实验拓扑 实验步骤 1、观察并分析IPv6 DAD过程 在AR1的G0/0/0开启抓包。AR1的G0/0/0接口配置ipv6地址2012::1/64。在接口配置ipv6地址后&#xff0c;ipv6有一段称为Tentative生命期&#xff0c;在该阶…

Sql Server 生成脚本中的快速删除空行问题

使用 Sql Server 生成脚本&#xff0c;例如生成存储过程&#xff0c;常常会因为存在大量没用的空行。如下图5w行的脚本&#xff0c;空行很多无用&#xff0c;需要删除。 手动删除很麻烦&#xff0c;想通过快捷方法删除这些空行&#xff0c;方法其实很简单&#xff01; 1、使用…

Vue集成echarts实现统计图表

目录 一、概述 二、Vue实现echarts图表模版 三、测试运行项目 一、概述 官网地址&#xff1a;https://echarts.apache.org/examples/zh/index.html 目前的官网的echarts例子比较古老&#xff0c;如果集成Vue里面需要进行修改&#xff0c;所以可以新建一个Vue的项目代码&am…

不同类型的 LLM 有什么区别

LLM 有不同类型的模型&#xff0c;例如 Base 和 Instruct&#xff0c;他们有什么区别呢&#xff0c;Base 模型是基于原始语料进行训练的模型&#xff0c;生成结果时会持续生成&#xff0c;直到达到最大长度。而指令模型是经过问答数据集进行训练的&#xff0c;回答是会根据上下…

【AI大模型】关于ToB垂直领域大模型的一点探索和尝试

本文分享了物流技术团队在垂直领域大模型开发和部署过程中的技术细节、挑战解决策略以及实际应用案例。 ‍ 背景 大家好&#xff0c;我们是淘天物流技术团队&#xff0c;在过去一年多的实践工作中&#xff0c;我们团队围绕“物流体验”这一垂直领域&#xff0c;尝试通过垂直…

大坝渗流监测设备——渗压计

渗压计是一种用于监测大坝等水工建筑物渗流压力的重要设备&#xff0c;其准确性和可靠性对于保障大坝安全运行至关重要。南京峟思将为大家详细介绍渗压计的工作原理、安装方法及其在大坝渗流监测中的应用。 渗压计主要利用振弦频率的变化来测量渗透水压力。设备由透水部件、感应…

使用UDP网络型灯光协议控制器控制DMX512步进电机

目录 1、硬件介绍 &#xff08;1&#xff09;灯光控制器 &#xff08;2&#xff09;步进电机 &#xff08;3&#xff09;接线图 &#xff08;4&#xff09;多路步进电机DMX接线 2、调试软件测试 &#xff08;1&#xff09;软件界面 &#xff08;2&#xff09;控制器ip地…

今夜无眠!Model 2来猎杀国产新能源了

文 | AUTO芯球 作者 | 雷慢 10月11日国内新能源车企注定会有一个不眠夜&#xff0c; 为什么啊&#xff0c;马斯克已经放出狠话了&#xff0c; 10月10日&#xff08;美东时间&#xff09;的发布会“将载入史册”&#xff0c; 别不信啊&#xff0c;据说这次会发布三款车&…

AI测试入门:向量数据库 知识图谱的适用场景

AI测试入门:向量数据库 & 知识图谱的适用场景 1. 向量数据库概述2. 知识图谱概述3. 适用场景分析3.1 使用向量数据库的场景3.2 使用知识图谱的场景4. 案例分析4.1 搜索引擎中的应用4.2 医疗健康领域的应用4.3 社交媒体平台中的应用4.4 供应链管理中的应用总结1. 向量数据库…

其他浏览器可以联网,但edge不能联网

问题描述&#xff1a; 今早edge无法上网&#xff0c;检测网络连接正常&#xff0c;而且其他chrome&#xff0c;Firefox和360浏览器都可以上网。 解决方案&#xff1a; 注意&#xff1a;为防止是代理问题&#xff0c;可以在扩展中禁用后再试试 如果没有代理或者禁用代理也不…

AIOps探索 | AI与人类协作:未来IT运维应急响应的新模式

内容来源于--布博士&#xff08;擎创科技产品解决方案专家&#xff09; 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;如同一场汹涌澎湃的浪潮&#xff0c;席卷着各个行业领域&#xff0c;IT 运维应急响应也正站在这一变革的风口浪尖。随着信息技术架构…

为什么越来越多的男性开始光顾美容机构?美业管理系统/个案疗愈系统源码

近年来&#xff0c;我们可以清晰地观察到一个明显的趋势&#xff1a;越来越多的男性开始光顾医美美容机构。这种现象的出现并非偶然&#xff0c;而是由多种因素共同作用的结果。 本文将结合社会观念的转变、媒体和广告的影响、职业发展压力、技术进步以及自我关注和健康意识的…

基于非线性干扰观测器的六自由度机械臂控制

1.观测器公式推导 当存在扰动时&#xff0c;机械臂的动力学方程如下&#xff1a; 对上式进行恒等变化得&#xff1a; 设计干扰观测器&#xff1a; 令&#xff0c;则&#xff1a; 观测误差满足 &#xff0c;取&#xff0c;因加速度不可测&#xff0c;定义辅助向量&#xff1a; …

爬虫工具——Fidder的安装

一、Fidder的安装 出现这样的界面就是安装成功了 二、Fiddler的配置 1.端监听手机端设置 但是如果你想要对手机上的app进行抓包怎么办呢&#xff0c;那么你还需要进行以下操作&#xff1a; 首先你的Fiddler所在的电脑和手机必须处在同一个局域网内(即连着同一个路由器)。 …

【MySQL 10】索引

目录 1.初始索引 1.1索引概念 1.2常见索引分类 1.3 见一下索引&#xff08;案例&#xff09; 2.关于物理磁盘 2.1见一下物理磁盘 2.2 了解磁盘的存储结构 2.3对磁盘的逻辑结构进行抽象 4.磁盘随机访问与连续访问 5.MySQL表与磁盘 3. MySQL 与磁盘的交互 3.1MySQL 与…

中国市场的NFT生存法则:消费属性与圈子文化

自2021年NFT数字藏品概念爆发以来&#xff0c;它迅速吸引了全球范围内的玩家、投资者以及艺术家和品牌的参与。然而&#xff0c;随着市场逐渐冷却&#xff0c;尤其是在中国市场&#xff0c;NFT的定位变得越来越微妙和复杂。在全球其他地区&#xff0c;NFT逐渐走向金融化&#x…

开源2+1链动S2B2C商城小程序下社区团长的社群温度营造与商业价值实现

摘要&#xff1a;本文聚焦于社区团长在社群运营中的角色&#xff0c;阐述在开源21链动S2B2C商城小程序的背景下&#xff0c;社区团长如何通过多种角色互动营造社群温度&#xff0c;进而实现商业价值中的复购增长等目标&#xff0c;分析其中的作用机制、面临的挑战及应对策略。 …