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

在這裏插入圖片描述

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()判斷是不是 空文件夾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章