golang入门day5 断点续传

Seek() 设置文件指针偏移

file.Seek 函数 设置文件指针的位置 第一个参数 : 相对偏移 第二个参数 相对哪个位置? 0 :start 1 current 2 end
file.Seek(2,0) // 文件开始相对向后偏移 2 个字节

断点续传

目的: 1 缩短文件传输耗时
2 异常中断,怎样继续从传输断掉的位置继续
3 传输文件的时候,支持暂停和恢复吗?即使暂停和恢复操作分别发生在进程被杀前后?

原理 :

1 创建一个 临时文件,时刻保存 已经复制好的数据量 即可。
2 当发生 已成中断, 重启程序的时候 ,只需要查看临时文件中记 录复制了多少即可。
3 复制完成后 , 删除掉临时文件即可。

strings.LastIndex(“path”) : 注意:这个是包含“/” 的,用的时候 记得避开这个“/”

bufio 包: 通过缓存提高效率

**原理: bufio提供缓冲区(内存),**读写操作都在缓冲区进行, 最后再读写文件, 降低了对磁盘的访问次数。

实现了 带缓存的 io操作 : 封装了 io reader 和 io writer

golang入门day5 断点续传_第1张图片

package main

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



func main(){
	/*
	fmt.Println("haha")
	bs := make([]byte,4,4)
	bs = append(bs,'A','B','C','D')
	fmt.Println(len(bs)," ", cap(bs))
	//fmt.Println(bs[:3])
	countStr := string(bs[:3])
	fmt.Printf("%T\n",countStr)
	//fmt.Println(countStr)
	count,err := strconv.ParseInt(countStr,10,64)
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println(count)

	 */

	file1, err := os.Create("/Users/mac/go/test5/a.txt")
	if err != nil{
		fmt.Println(err)
		return
	}
	bs :=[]byte{'A','B'}
	file1.Write(bs) // 默认 追加写
	bs2 :=[]byte{'C','D'}
	file1.Write(bs2)

	// 创建 Reader 对象
	file1.Seek(0,io.SeekStart)
	b1 := bufio.NewReader(file1)
	//接收缓冲区
	data := make([]byte,1024,1024)
	//读入到缓冲区 data中
	n, err := b1.Read(data)
	if err != nil{
		fmt.Println(err)
	}
	fmt.Println("read count:",n)
}

golang入门day5 断点续传_第2张图片由上图可见 ,读取的方法很多,我们到时候看具体情况来进行读取使用。

s2 := “”
fmt 包下的 ScanIn(&s2)

golang入门day5 断点续传_第3张图片

//io 包下的 Scanner 可以解决上边的问题
b2 := bufio.NewReader(os.Stdin)
ret2, _ :=b2.ReadString('\n') // 以换行苻作为结束标志
fmt.Println(ret2)

golang入门day5 断点续传_第4张图片

bufio 写入的文件 要及时进行刷新到内存 : w1.Flush() //w1为Witer对象

ioutil包

我们直到 io.FileRead() 会将文件的所有内容一次性拷贝下来,

所以不太好

ioutil下的 WriteFile 默认会覆盖文件中的原有内容

ioutil.ReadDir() 可以获取目录下的目录/文件 。但只能获取一层

临时目录和临时文件 : dir , err := ioutil.TempDir((dir)path, prefix(前缀):“Test”)

不用的话 ,要记得删除这个临时文件 /临时目录

ioutil.ReadDir() 获取一个目录下的子内容, 只能获取一层目录/文件
怎么获取所有的呢? 我们可以手动实现,用递归的思路。

并借助 IsDir()判断是不是 空文件夹

你可能感兴趣的:(golang)