文件程序中是以流的形式操做的。緩存
流:數據在數據源(文件)和程序(內存)之間經歷的路徑;函數
輸入流:數據從數據源到程序的路徑;spa
輸出流:數據從程序到數據源的路徑;code
經常使用的文件操做和函數:blog
1.經常使用的文件操做函數和方法(打開和關閉文件)圖片
2.讀取文件中的內榮,並顯示給終端(帶緩衝區的方式),使用os.Open(),file.Close(),bufio.NewReader(),reader.ReadString()內存
3.讀取問價並顯示在終端(使用Ioutil一次將整個文件讀入到內存中) ,這種方式適用於文件不太大狀況下,相關方法ioutil.ReadFilestring
4.寫文件it
(1)建立一個新文件夾,並寫入hello world;io
(2)打開一個存在的文件,並將內容覆蓋爲新的;
(3)打開一個存在的文件,並在末尾追加新內容;
(4)打開一個存在的文件,將原來的內容讀出並顯示在終端,而且追加新內容;
package main import ( "bufio" "fmt" "io" "os" ) func main() { filepath := "test.txt" //主要是參數的區別 file, err := os.OpenFile(filepath, os.O_RDWR|os.O_APPEND, 0666) if err != nil { fmt.Println("open file error=\n", err) } defer file.Close() reader := bufio.NewReader(file) for { str, err := reader.ReadString('\n') if err == io.EOF { break } fmt.Println(str) } str := "hello world\n" writer := bufio.NewWriter(file) for i := 0; i < 5; i++ { writer.WriteString(str) } //由於writer是帶緩存的,所以在調用WriteString的時候是先將數據存入到緩存的 //所以真正寫入到文件中是要用Flush方法,不然文件中會沒有數據 writer.Flush() }
5.讀取一個文件中的內容寫到另外一個文件中
6.判斷文件或目錄是否存在
說明:若是文件夾存在,則返回true,nil;若是文件夾不存在,則返回false,nil;若是返回false,err,則說明是其它錯誤。
7.將一個目錄下的圖片拷貝到另外一個目錄下
package main import ( "bufio" "fmt" "io" "os" ) func copyFile(dstFileName string, srcFileName string) (written int64, err error) { srcfile, err := os.Open(srcFileName) if err != nil { fmt.Println("open file error=", err) } defer srcfile.Close() reader := bufio.NewReader(srcfile) dstfile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println("open file error=", err) } defer dstfile.Close() writer := bufio.NewWriter(dstfile) return io.Copy(writer, reader) } func main() { file1path := "D:/dlrb.jpg" file2path := "E:/dlrb.jpg" _, err := copyFile(file2path, file1path) if err == nil { fmt.Println("拷貝完成") } else { fmt.Println("拷貝失敗 error=", err) } }
8.統計文件裏面的不一樣種類字符的個數
func main() { file1path := "test1.txt" srcfile, err := os.Open(file1path) if err != nil { fmt.Println("open file error=", err) return } defer srcfile.Close() var count charCount reader := bufio.NewReader(srcfile) for { str, err := reader.ReadString('\n') if err == io.EOF { break } for _, v := range str { fmt.Println(string(v)) switch { case v >= 'a' && v <= 'z': fallthrough case v >= 'A' && v <= 'z': count.chCount++ case v == ' ' || v == '\t': count.spaceCount++ case v >= '0' && v <= '9': count.numCount++ default: count.otherCount++ } } } fmt.Printf("字符個數:%v,數字個數:%v,空格個數:%v,其它個數:%v", count.chCount, count.numCount, count.spaceCount, count.otherCount) }