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
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)
}
由上图可见 ,读取的方法很多,我们到时候看具体情况来进行读取使用。
s2 := “”
fmt 包下的 ScanIn(&s2)
//io 包下的 Scanner 可以解决上边的问题
b2 := bufio.NewReader(os.Stdin)
ret2, _ :=b2.ReadString('\n') // 以换行苻作为结束标志
fmt.Println(ret2)
bufio 写入的文件 要及时进行刷新到内存 : w1.Flush() //w1为Witer对象
ioutil包
我们直到 io.FileRead() 会将文件的所有内容一次性拷贝下来,
所以不太好
ioutil下的 WriteFile 默认会覆盖文件中的原有内容
ioutil.ReadDir() 可以获取目录下的目录/文件 。但只能获取一层
临时目录和临时文件 : dir , err := ioutil.TempDir((dir)path, prefix(前缀):“Test”)
不用的话 ,要记得删除这个临时文件 /临时目录
ioutil.ReadDir() 获取一个目录下的子内容, 只能获取一层目录/文件
怎么获取所有的呢? 我们可以手动实现,用递归的思路。
并借助 IsDir()判断是不是 空文件夹