go标准库之io模块

246 阅读1分钟

Go语言中,为了方便开发者使用,将IO操作封装在了如下几个包中:

  • ioIO 原语( I/O primitives )提供基本的接口 os File Reader Writer
  • io/ioutil 封装一些实用的 I/O 函数
  • fmt 实现格式化 I/O ,类似 C 语言中的 printfscanf format fmt
  • bufio 实现缓存 I/O

基本的 IO 接口

Reader 接口

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

Writer接口

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

哪些类型实现了Reader和Writer接口

image.png

例子

package main

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

func test_strings_Reader() {
	r := strings.NewReader("hello world")
	// 读取10个字符
	buf := make([]byte, 10)
	r.Read(buf)
	fmt.Printf("string(buf): %v\n", string(buf))
}

func testCopy() {
	r := strings.NewReader("hello world")

	// 把r的内容拷贝输出 Stdout 标准输出
	_, err := io.Copy(os.Stdout, r)
	if err != nil {
		log.Fatal(err)
	}
}

func copyBuffer() {
	r := strings.NewReader("hello world")
	// 第一buf 让程序一次读取8个字符 之前为读一个写一个
	buf := make([]byte, 8)
	_, err := io.CopyBuffer(os.Stdout, r, buf)
	if err != nil {
		log.Fatal(err)
	}
}

func main() {
	// test_strings_Reader()
	// testCopy()
	copyBuffer()
}

ioutil包的使用

image.png

  • ioutil 中封装好了很多的文件操作方法
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
)

// 读取文件的全部内容
func testReadAll() {
	f, _ := os.Open("test.txt")
	defer f.Close()

	// 读取test.txt的全部内容
	b, err := ioutil.ReadAll(f)
	if err != nil {
		fmt.Printf("err: %v\n", err)
	}
	fmt.Printf("string(b): %v\n", string(b))
}

// 打印当前程序目录下的所有文件
func testReadDir() {
	fi, _ := ioutil.ReadDir(".")
	for _, v := range fi {
		fmt.Printf("v.Name(): %v\n", v.Name())
	}
}

// 读文件
func testReadFile() {
	b, _ := ioutil.ReadFile("test.txt")
	// 要变成string才能输出 不然是一个buffer格式
	fmt.Printf("string(b): %v\n", string(b))
}

// 写文件
func testWriteFile() {
	// 覆盖原来内容
	ioutil.WriteFile("test.txt", []byte("hello world"), 0664)
}

// 创建临时文件
func testTempFile() {
	content := []byte("temporary file's content")
	temfile, err := ioutil.TempFile("", "example")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("temfile.Name(): %v\n", temfile.Name()) //  C:\Users\xxx\AppData\Local\Temp\example4170587381
	defer os.Remove(temfile.Name())
	if _, err = temfile.Write(content); err != nil {
		log.Fatal(err)
	}
}

func main() {
	// testReadAll()
	// testReadDir()
	// testReadFile()
	// testWriteFile()
	testTempFile()
}