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