1.打开和关闭文件

  1. //只读方式打开当前目录下的main.go文件
  2. file, err := os.Open("./main.go")
  3. if err != nil {
  4. fmt.Println("open file failed!!!",err)
  5. return
  6. }
  7. //关闭文件
  8. file.Close()

为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句。

2.读取文件

2.1file.Read()

基本使用

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. func main() {
  8. file, err := os.Open("./Client.go") //打开文件
  9. if err != nil {
  10. fmt.Println("open file failed",err)
  11. }
  12. defer file.Close() //关闭文件
  13. var tmp = make([]byte,1024) //申请1024字节空间
  14. n, err := file.Read(tmp) //文件读取返回字节数
  15. if err == io.EOF{
  16. fmt.Println("文件读完了")
  17. return
  18. }
  19. if err != nil{
  20. fmt.Println("read file failed,err",err)
  21. return
  22. }
  23. fmt.Printf("读完了%d字节数据\n",n) //打印字节数
  24. fmt.Println(string(tmp[:n])) //打印文件内容
  25. }

循环读取

  1. import (
  2. "fmt"
  3. "io"
  4. "os"
  5. )
  6. func main() {
  7. file, err := os.Open("./Client.go") //打开文件
  8. if err != nil {
  9. fmt.Println("open file failed",err)
  10. return
  11. }
  12. defer file.Close() //关闭文件
  13. var content []byte //内容切片
  14. var tmp = make([]byte,128) //申请1024字节空间
  15. //循环都群
  16. for {
  17. n, err := file.Read(tmp)
  18. if err == io.EOF {
  19. fmt.Println("文件读完了")
  20. break
  21. }
  22. if err != nil {
  23. fmt.Println("read file failed",err)
  24. return
  25. }
  26. content = append(content,tmp[:n]...)
  27. }
  28. fmt.Println(string(content))
  29. }

2.2bufio读取文件

bufio是在file的基础上封装了一层API,支持更多的功能。

  1. import (
  2. "bufio"
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. func main() {
  8. file, err := os.Open("./Client.go")
  9. if err != nil {
  10. fmt.Println("open file failed",err)
  11. return
  12. }
  13. defer file.Close()
  14. reader := bufio.NewReader(file)
  15. for {
  16. line, err := reader.ReadString('\n')
  17. if err == io.EOF {
  18. if len(line) != 0 {
  19. fmt.Println(line)
  20. }
  21. fmt.Println("文件读完了")
  22. break
  23. }
  24. if err != nil {
  25. fmt.Println("read file failed",err)
  26. }
  27. fmt.Println(line)
  28. }
  29. }

2.3ioutil读取整个文件

io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。

  1. import (
  2. "fmt"
  3. "io/ioutil"
  4. )
  5. func main() {
  6. file, err := ioutil.ReadFile("./Client.go")
  7. if err != nil {
  8. fmt.Println("read file failed",err)
  9. return
  10. }
  11. fmt.Println(string(file))
  12. }

3.文件写入操作

3.1Write和WriteString

  1. func main() {
  2. file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  3. if err != nil {
  4. fmt.Println("open file failed",err)
  5. return
  6. }
  7. defer file.Close()
  8. str := "Hello World!!!"
  9. file.Write([]byte(str)) //写入字节切片数据
  10. file.WriteString(str) //直接写入字符串数据
  11. }

3.2bufio.NewWriter

  1. file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  2. if err != nil {
  3. fmt.Println("open file failed",err)
  4. return
  5. }
  6. defer file.Close()
  7. writer := bufio.NewWriter(file)
  8. for i := 0; i < 10; i++ {
  9. writer.WriteString("HelloWorld")
  10. }
  11. writer.Flush()

3.3ioutil.WriteFile

  1. str := "Hello World"
  2. err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
  3. if err != nil {
  4. fmt.Println("write file failed",err)
  5. return
  6. }