package main import ( "fmt" "io" "os" ) func main() { /*打開文件 ,若是文件不存在將會新建,若是已存在,新寫入的內容將追加到文件尾 os.O_RDONLY : 若是設置爲只讀,那麼將寫入不了數據 os.O_RDWR : 設置爲讀寫 */ f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666) if err != nil { fmt.Println(err) } defer f.Close() f.WriteString("test a string!") buf := make([]byte, 1024) var str string /*重置文件指針,不然讀不到內容的。*/ f.Seek(0, os.SEEK_SET) for { n, ferr := f.Read(buf) if ferr != nil && ferr != io.EOF { fmt.Println(ferr.Error()) break } if n == 0 { break } fmt.Println(n) str += string(buf[0:n]) } fmt.Println(str) }
1.func (f *File) Seek(offset int64, whence int) (ret int64, err error) Seek 用來設置文件指針的位置,offet 是偏移量,whence 的取值能夠是下面的三個: SEEK_SET 相對文件開始偏移 SEEK_CUR 相對文件當前位置偏移 SEEK_END 相對文件末尾偏移函數
1.func ReadAll(r io.Reader) ([]byte, error) 從 r 中讀取全部內容指針
package main import ( "fmt" "os" "io/ioutil" ) func main() { f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666) if err != nil { fmt.Println(err) } defer f.Close() //f.WriteString("test a string!") buf, err := ioutil.ReadAll(f) if err != nil { fmt.Println(err) return } fmt.Println(string(buf)) }
2.func ReadFile(filename string) ([]byte, error) 從文件 filename 中讀取內容,一次性讀取整個文件,成功 error=nil。code
package main import ( "fmt" "io/ioutil" ) func main() { buf, err := ioutil.ReadFile("./test.txt") if err != nil { fmt.Println(err.Error()) return } fmt.Println(string(buf)) }
3.func WriteFile(filename string, data []byte, perm os.FileMode) error 向文件中寫數據,若是文件不存在,將以 perm 權限建立文件。對象
//若是原來文件有內容,則會刪除覆蓋掉 package main import ( "fmt" "io/ioutil" ) func main() { err := ioutil.WriteFile("./test.txt", []byte("abcdefg"), 0777) if err != nil { fmt.Println(err.Error()) } else { fmt.Println("OK") } }
OpenFile 除了能夠打開文件,還能夠打開一個目錄。在 File 對像有一個 Readdir 函數,用來讀取某目錄下的全部文件和目錄信息,位於 OS 包中.string
1.func (f *File) Readdir(n int) (fi []FileInfo, err error) n>0 最多返回 n 個文件。如個小於等零,返回全部的。it
filepath.Walk 也是用 Readdir 來實現的io
package main import ( "fmt" "os" ) func main() { f, err := os.OpenFile("./", os.O_RDONLY, 0666) if err != nil { fmt.Println(err) return } arrFile, err1 := f.Readdir(0) if err1 != nil { fmt.Println(err1) return } for k, v := range arrFile { fmt.Println(k, "\t", v.Name(), "\t", v.IsDir()) } }
1.func ReadDir(dirname string) ([]os.FileInfo, error) 讀取目錄下全部的文件和子目錄function
package main import ( "fmt" "io/ioutil" ) func main() { arrFile, err := ioutil.ReadDir("./") if err != nil { fmt.Println(err.Error()) return } for k, v := range arrFile { fmt.Println(k, "\t", v.Name(), "\t", v.IsDir()) } }
序列化就是將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程。test
Gob 是 Go 中所特有的序列化技術,它支持除 interface,function,channel 外的全部 Go 數 據類型。序列化使用 Encoder,反序列化使用 Decoder。import
package main import ( "encoding/gob" "fmt" "os" ) type Student struct { Name string Age int } func main() { s := &Student{"張三", 19} f, err := os.Create("data.dat") if err != nil { fmt.Println(err) return } defer f.Close() //建立 Encoder 對像 encode := gob.NewEncoder(f) //將s序列化到f文件中 encode.Encode(s) //重置文件指針到開始位置 f.Seek(0, os.SEEK_SET) decoder := gob.NewDecoder(f) var s1 Student //反序列化對像 decoder.Decode(&s1) fmt.Println(s1) }