读取文件
读取文件有三种方式:
将文件整个读入内存
按字节数读取
按行读取
具体实现如下:
1、将文件整个读入内存
package main import ( "os" "io/ioutil" "fmt" ) func main() { file, err := os.Open("D:/gopath/src/golang_development_notes/example/log.txt") if err != nil { panic(err) } defer file.Close() content, err := ioutil.ReadAll(file) fmt.Println(string(content)) }
或者
package main import ( "os" "io/ioutil" "fmt" ) func main() { filepath := "D:/gopath/src/golang_development_notes/example/log.txt" content ,err :=ioutil.ReadFile(filepath) if err !=nil { panic(err) } fmt.Println(string(content)) }
将文件整个读入内存,效率比较高,占用内存也最高。
2、按字节读取文件
package main import ( "bufio" "fmt" "io" "io/ioutil" "os" ) func main() { filepath := "D:/gopath/src/golang_development_notes/example/log.txt" fi, err := os.Open(filepath) if err != nil { panic(err) } defer fi.Close() r := bufio.NewReader(fi) chunks := make([]byte, 0) buf := make([]byte, 1024) //一次读取多少个字节 for { n, err := r.Read(buf) if err != nil && err != io.EOF { panic(err) } fmt.Println(string(buf[:n])) break if 0 == n { break } chunks = append(chunks, buf[:n]...) } fmt.Println(string(chunks)) }
或
package main import ( "fmt" "io" "os" ) func main() { file := "D:/gopath/src/example/example/log.txt" f, err := os.Open(file) if err != nil { panic(err) } defer f.Close() chunks := make([]byte, 0) buf := make([]byte, 1024) for { n, err := f.Read(buf) if err != nil && err != io.EOF { panic(err) } if 0 == n { break } chunks = append(chunks, buf[:n]...) } fmt.Println(string(chunks)) }
3、按行读取
package main import ( "bufio" "fmt" "io" "io/ioutil" "os" "strings" ) func main() { filepath := "D:/gopath/src/golang_development_notes/example/log.txt" file, err := os.OpenFile(filepath, os.O_RDWR, 0666) if err != nil { fmt.Println("Open file error!", err) return } defer file.Close() stat, err := file.Stat() if err != nil { panic(err) } var size = stat.Size() fmt.Println("file size=", size) buf := bufio.NewReader(file) for { line, err := buf.ReadString('\n') line = strings.TrimSpace(line) fmt.Println(line) if err != nil { if err == io.EOF { fmt.Println("File read ok!") break } else { fmt.Println("Read file error!", err) return } } } }
写入文件
有以下写入方式
1、ioutil.WriteFile
package main import ( "io/ioutil" ) func main() { content := []byte("测试1\n测试2\n") err := ioutil.WriteFile("test.txt", content, 0644) if err != nil { panic(err) } }
这种方式每次都会覆盖 test.txt内容,如果test.txt文件不存在会创建。
2、os
package main import ( "fmt" "io" "os" ) func checkFileIsExist(filename string) bool { if _, err := os.Stat(filename); os.IsNotExist(err) { return false } return true } func main() { var wireteString = "测试1\n测试2\n" var filename = "./test.txt" var f *os.File var err1 error if checkFileIsExist(filename) { //如果文件存在 f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件 fmt.Println("文件存在") } else { f, err1 = os.Create(filename) //创建文件 fmt.Println("文件不存在") } defer f.Close() n, err1 := io.WriteString(f, wireteString) //写入文件(字符串) if err1 != nil { panic(err1) } fmt.Printf("写入 %d 个字节n", n) }
此种方法可以在文件内容末尾添加新内容。
3、
package main import ( "fmt" "os" ) func checkFileIsExist(filename string) bool { if _, err := os.Stat(filename); os.IsNotExist(err) { return false } return true } func main() { var str = "测试1\n测试2\n" var filename = "./test.txt" var f *os.File var err1 error if checkFileIsExist(filename) { //如果文件存在 f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件 fmt.Println("文件存在") } else { f, err1 = os.Create(filename) //创建文件 fmt.Println("文件不存在") } defer f.Close() n, err1 := f.Write([]byte(str)) //写入文件(字节数组) fmt.Printf("写入 %d 个字节n", n) n, err1 = f.WriteString(str) //写入文件(字符串) if err1 != nil { panic(err1) } fmt.Printf("写入 %d 个字节n", n) f.Sync() }
此种方法可以在文件内容末尾添加新内容。
4、bufio
package main import ( "bufio" "fmt" "os" ) func checkFileIsExist(filename string) bool { if _, err := os.Stat(filename); os.IsNotExist(err) { return false } return true } func main() { var str = "测试1\n测试2\n" var filename = "./test.txt" var f *os.File var err1 error if checkFileIsExist(filename) { //如果文件存在 f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件 fmt.Println("文件存在") } else { f, err1 = os.Create(filename) //创建文件 fmt.Println("文件不存在") } defer f.Close() if err1 != nil { panic(err1) } w := bufio.NewWriter(f) //创建新的 Writer 对象 n, _ := w.WriteString(str) fmt.Printf("写入 %d 个字节n", n) w.Flush() }
此种方法可以在文件内容末尾添加新内容。