Go_io操作

I/O操作也叫输入输出操作。其中I是指Input,O是指Output,用于读或者写数据的,有些语言中也叫流操作,是指数据通信的通道。

Golang 标准库对 IO 的抽象非常精巧,各个组件可以随意组合,可以作为接口设计的典范。

1. 读取数据

package main

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

func main() {
	/*
	读取数据:
		Reader接口:
			//方法
			Read(p []byte)(n int, error) //n是读到的字节数
	 */
	//读取本地aa.txt文件中的数据
	//step1:打开文件
	fileName := "/Users/ruby/Documents/pro/a/aa.txt" //内容 abcdefghij
	file, err := os.Open(fileName)
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	//step3:关闭文件
	defer file.Close()

	//step2:读取数据
	bs := make([]byte, 4, 4) //实际中是1024或者1024*2/*4

	//第一次读取
	n, err := file.Read(bs) //向切片中存储数据
	fmt.Println(err)        //<nil>
	fmt.Println(n)          //4
	fmt.Println(bs)         //[97 98 99 100]
	fmt.Println(string(bs)) //abcd

	//第二次读取
	n, err = file.Read(bs)
	fmt.Println(err)        //<nil>
	fmt.Println(n)          //4
	fmt.Println(bs)         //[101 102 103 104]
	fmt.Println(string(bs)) //efgh

	//第三次读取
	n, err = file.Read(bs)
	fmt.Println(err)        //<nil>
	fmt.Println(n)          //2
	fmt.Println(bs)         //[105 106 103 104]
	fmt.Println(string(bs)) //ijgh

	//第四次读取
	n, err = file.Read(bs)
	fmt.Println(err) //EOF
	fmt.Println(n)   //0

	n := -1
	for {
		n, err = file.Read(bs)
		if n == 0 || err == io.EOF {
			fmt.Println("读取到了文件的末尾,结束读取操作。。")
			break
		}
		fmt.Println(string(bs[:n]))
	}
}

2. 写出数据

package main

import (
	"os"
	"fmt"
	"log"
)

func main() {
	/*
	写出数据:
	 */

	fileName := "/Users/ruby/Documents/pro/a/ab.txt"
	//step1:打开文件
	//step2:写出数据
	//step3:关闭文件
	//file,err := os.Open(fileName)
	
	//os.O_CREATE 不存在就创建
	//os.O_WRONLY 每次都会覆盖掉原有的内容
	//os.O_APPEND 每次向问文件的末尾开始写
	file,err := os.OpenFile(fileName,os.O_CREATE|os.O_WRONLY|os.O_APPEND,os.ModePerm)
	if err != nil{
		fmt.Println(err)
		return
	}
	defer file.Close()

	//写出数据
	//bs :=[]byte{65,66,67,68,69,70}//A,B,C,D,E,F
	bs :=[] byte{97,98,99,100} //a,b,c,d
	//n,err := file.Write(bs)
	n,err := file.Write(bs[:2]) //n是写出多少字节(整数)
	fmt.Println(n)
	HandleErr(err)
	file.WriteString("
")

	//直接写出字符串
	n,err = file.WriteString("HelloWorld")
	fmt.Println(n)
	HandleErr(err)

	file.WriteString("
")
	n,err =file.Write([]byte("today")) //转成切片(字节类型)
	fmt.Println(n)
	HandleErr(err)

}

//处理错误的函数
func HandleErr(err error){
	if err != nil{
		log.Fatal(err)
	}
}