日常學習總結golang(day5)---文件操作

文件操作

文件是什麼?
計算機中的文件是存儲再外部介質(通常是磁盤)上的數據集合,文件分爲文本文件和二進制文件。

1. 打開和關閉文件

os.Open()函數能夠打開一個文件,返回一個*File和一個err。對得到的文件實例調用close()方法能夠關閉文件。

func main() {
	//只讀的方式打開當前目錄下的demo.go
	file,err:=os.Open("./demo.go")
	if err !=nil{
		fmt.Println("open file failed!,err:",err)
		return
	}
	//延遲關閉
	//不能將defer放在err判斷之前:
	//當err有值時,也就是說有錯時,file就是nil,nil是不能調用Close()的,會出現panic的
	defer file.Close()
}

爲了防止文件忘記關閉,我們通常使用defer延遲關閉語句。

2. 讀取文件

(1).file.Read():
Read方法定義:func (f *File)Read(b []byte)(n int,err error)
它接收一個字節切片,返回讀取的字節數和可能的具體錯誤。讀到文件末尾時會返回0io.EOF.

func main() {
	//只讀的方式打開當前目錄下的demo.go
	file, err := os.Open("./demo.go")
	if err != nil {
		fmt.Println("open file failed!,err:", err)
		return
	}
	//延遲關閉
	defer file.Close()
	//使用Read方法讀取數據
	var tmp = make([]byte, 128) //指定讀的長度
	n, err := file.Read(tmp)
	if err == io.EOF {
	fmt.Println("文件讀完了")
		return
	}
	if err != nil {
		fmt.Println("read file failed ,err:", err)
		return
	}
	//如果文件內容大於128個字節,這時只會讀取128個字節,如果小於128,就會將所有的字節數輸出。
	fmt.Printf("讀取了%d個字節數據\n", n)//讀取了128個字節數據
	fmt.Println(string(tmp[:n]))//從開始到第128個字節打印出來
}

循環讀取:

func main() {
	//只讀的方式打開當前目錄下的demo.go
	file, err := os.Open("./demo.go")
	if err != nil {
		fmt.Println("open file failed!,err:", err)
		return
	}
	//延遲關閉
	defer file.Close()
	//循環讀取文件
	var content []byte
	var tmp = make([]byte, 128)
	for {
	n, err := file.Read(tmp)
		if err == io.EOF {
			fmt.Println("文件讀完了")
			break //如果文件讀完了,直接跳出循環
		}
		if err != nil {
			fmt.Println("read file failed ,err:", err)
			return
		}
		//將每次讀取的128個字節都追加到content變量中去
		content = append(content, tmp[:n]...)
	}
	fmt.Println(string(content))
}

(2).bufio讀取文件
bufio在file的基礎上封裝了一層API,支持更多的功能

func main() {
	//只讀的方式打開當前目錄下的123.txt
	file, err := os.Open("./123.txt")
	if err != nil {
		fmt.Println("open file failed!,err:", err)
		return
	}
	//延遲關閉
	defer file.Close()
	//創建一個用來從文件中讀內容的對象
	reader := bufio.NewReader(file)
	for {
		//按行讀取數據
		line, err := reader.ReadString('\n') //注意是字符
		if err == io.EOF {
			if len(line) != 0 {
				fmt.Println(line)
			}
			fmt.Println("文件讀完了")
			break
		}
		if err != nil {
			fmt.Println("read file failed,err:", err)
			return
		}
		fmt.Print(line)
	}
}

(3).ioutil讀取整個文件
io.ioutil包的ReadFile方法能夠讀取完整的文件,只需要將文件名作爲參數傳入。

func main() {
	//只讀的方式打開當前目錄下的demo.go
	file, err := ioutil.ReadFile("./demo.go")
	if err != nil {
		fmt.Println("read file failed!,err:", err)
		return
	}
	fmt.Println(string(file))
}
3. 寫入文件

(1).os.Open()函數能夠以指定的模式打開文件,從而實現文件寫入相關功能

func OpenFile(name string ,flag int ,perm FileMode)(*File,error){
	...
}

其中:name:要打開的文件名flag:打開文件模式。模式有以下幾種:

模式 含義
os.O_WRONLY 只寫
os.O_CREATE 創建文件
os.O_RDONLY 只讀
os.O_RDWR 讀寫
os.O_TRUNC 清空
os.O_APPEND 追加

perm:文件權限,一個八進制數,r(讀)04,w(寫)02,x(執行)01.在Linux下使用。
(2).Write和WriteString

func main() {
	file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("open file failed,err:", err)
		return
	}
	defer file.Close()
	str := "hello world"
	n, err := file.Write([]byte(str)) //寫入字節切片數據
	if err != nil {
		fmt.Println("寫入字節切片數據錯誤,err:", err)
		return
	}
	fmt.Printf("寫入的字符個數:%v\n", n)//寫入的字符個數:11

	s, err := file.WriteString("hello,可以交個朋友嗎?") //直接寫入字符串數據
	if err != nil {
		fmt.Println("寫入字符串數據錯誤,err:", err)
		return
	}
	fmt.Printf("寫入的字符個數:%v\n", s)//寫入的字符個數:30
}

(3).bufio.NewWriter

func main() {
	file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println("open file failed,err:", err)
		return
	}
	defer file.Close()
	writer := bufio.NewWriter(file)
	for i := 0; i < 10; i++ {
		writer.WriteString("今天天氣不錯吖!") //將數據先寫入緩存
	}
	writer.Flush() //將緩存中的內容寫入文件
}

(4).ioutil.WriteFile

func main() {
	str := "你今天看起來很不一樣哦!"
	err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
	if err != nil {
		fmt.Println("write file failed ,err:", err)
		return
	}
}
4. copyFile

拷貝文件函數:藉助io.Copy()實現一個拷貝函數。

//CopyFile拷貝文件函數
func CopyFile(dstName, srcName string) (written int64, err error) {
	//以讀方式打開源文件
	src, err := os.Open(srcName)
	if err != nil {
		fmt.Printf("open %s failed,err:%v\n", srcName, err)
		return
	}
	defer src.Close()
	//以寫|創建的方式打開目標文件
	dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		fmt.Printf("open %s failed,err:%v\n", dstName, err)
		return
	}
	defer dst.Close()
	return io.Copy(dst, src)
}
func main() {
	_,err:=CopyFile("dst.txt","123.txt")
	if err != nil {
		fmt.Printf("copy file failed,err:%v\n", err)
		return
	}
	fmt.Println("copy done!")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章