TypechoJoeTheme

Toasobi的博客

7.28 常用标准库 - IO操作

本文最后更新于2022年08月01日,已超过779天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

注:该篇文章主要讲解学习心得,详细可以看Golang官方常用标准库文档内容

1.1 关于各个参数的类型

首先常见的os系列:
终端其实是一个文件,相关实例如下:

  • os.Stdin:标准输入的文件实例,类型为*File
  • os.Stdout:标准输出的文件实例,类型为*File
  • os.Stderr:标准错误输出的文件实例,类型为*File

其次是bufio包,其中bufio.NewWriter,bufio.NewReader等方法返回的对象类型为*bufio.Reader

然而在真正参数传递的时候,参数类型写io.Reader则可以接收上述所有类型的参数
举例:

func ReadFrom(reader io.Reader, num int) ([]byte, error) {
    // 开辟内存空间
    p := make([]byte, num)
    // 将数组读取到变量中
    n, err := reader.Read(p)
    if n > 0 {
        return p[:n], nil
    }
    return p, err
}

我们创建一个用来文件读取的函数,其形参类型为io.Reader
其次我们传递不同的参数

// 字符串中读取
data, _ := ReadFrom(strings.NewReader("from string"), 12)

// 从命令行中读取
data, _ := ReadFrom(os.Stdin, 11)

// 从文件中读取
file, _ := os.Open("main.go")
// 关闭文件资源
defer file.Close()

data, _ := ReadFrom(file, 10)
fmt.Println(data)

所有的传参都可以成立,所以我将他们比作一个父类型包括好几个子类型

1.2常用的文件读写方式

1.首先是最简单的read和write方式,需要文件对象

//写入
file.WriteString("ab\n")
file.Write([]byte("cd\n"))

//读取
 n, err := file.Read(buf[:])
content = append(content, buf[:n]...)

注意处理err
要读取整个文件只需要加上一个死循环,以io.EOF作为跳出标准即可

2.其次是bufio包

  • bufio包实现了带缓冲区的读写,是对文件读写的封装
  • bufio缓冲写数据
  • io.EOF同样是跳出循环的标准

    //写数据
    writer := bufio.NewWriter(file)
      for i := 0; i < 10; i++ {
          writer.WriteString("hello\n")
      }
      // 刷新缓冲区,强制写出
      writer.Flush()
    
    //读取数据
     reader := bufio.NewReader(file)
    for {
          line, _, err := reader.ReadLine()
          if err == io.EOF {
              break
          }
          if err != nil {
              return
          }
          fmt.Println(string(line))
      }

    推荐使用
    除了reader.ReadLine()之外还有reader.ReadBytes()按字节读取哦

ioutil工具包

//写数据
err := ioutil.WriteFile("./yyy.txt", []byte("www.5lmh.com"), 0666)
//读数据
content, err := ioutil.ReadFile("./yyy.txt")
fmt.Println(string(content))

这个很方便,好像读取的时候要读整篇也不用加循环
爬虫脚本一般用它的readall方法

操作文件

文件打开与关闭

// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.go")
defer file.Close()

创建文件

// 新建文件
file, err := os.Create("./xxx.txt")

拷贝文件

// 打开源文件
    srcFile, err := os.Open("./xxx.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 创建新文件
    dstFile, err2 := os.Create("./abc2.txt")
    if err2 != nil {
        fmt.Println(err2)
        return
    }
    // 缓冲读取
    buf := make([]byte, 1024)
    for {
        // 从源文件读数据
        n, err := srcFile.Read(buf)
        if err == io.EOF {
            fmt.Println("读取完毕")
            break
        }
        if err != nil {
            fmt.Println(err)
            break
        }
        //写出去
        dstFile.Write(buf[:n])
    }
    srcFile.Close()
    dstFile.Close()
}

文件操作配置

这里要使用os.openFile()函数打开文件,后面参数填模式

file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)

所有模式如下:

模式含义
os.O_WRONLY只写
os.O_CREATE创建文件
os.O_RDONLY只读
os.O_RDWR读写
os.O_TRUNC清空
os.O_APPEND追加

结束!

朗读
赞(0)
评论 (0)