Skip to content

5.2、Golang标准库-io输入输出

io包封装了如下操作

  • io 为IO原语操作(I/O primitives)提供基本的接口 os、File、Reader、Writer
  • io/ioutil 封装了一些实用函数
  • fmt 实现了格式化I/O,类似C语言中的printf 和 scanf
  • bufio 实现带缓冲的I/O

基本的IO接口

go
type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

以下类型实现了Reader和Writer接口

go
os.File (Reader和Writer)
strings.Reader (Reader)
bufio.Reader (Reader)
bufio.Writer (Writer)
bytes.Buffer (Reader和Writer)
bytes.Reader (Reader)
compress/gzip.Reader (Reader)
compress/gzip.Writer (Writer)
crypto/cipher.StreamReader (Reader)
crypto/cipher.StreamWriter (Writer)
crypto/tls.Conn (Reader和Writer)
encoding/csv.Reader (Reader)
encoding/csv.Writer (Writer)

示例

go
package main

import (
    "fmt"
    "strings"
)

func main() {
    r := strings.NewReader("Hello world")
    buf := make([]byte, 5)
    n, err := r.Read(buf)
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("n: %v\n", n)
        // n: 5
        fmt.Printf("buf: %v\n", string(buf))
        // buf: Hello
    }

}

reader拷贝到writer

go
package main

import (
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    r := strings.NewReader("Hello world")

    // 复制到标准输出流,实际效果为:打印到控制台
    _, err := io.Copy(os.Stdout, r)
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
    // Hello world
}

带缓冲区的拷贝

go
package main

import (
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    r := strings.NewReader("Hello world")
    buf := make([]byte, 8)

    _, err := io.CopyBuffer(os.Stdout, r, buf)
    if err != nil {
        fmt.Printf("err: %v\n", err)
    }
    // Hello world
}