1. I/O操作也叫输入输出操作。I指Input,O指Output;用于读写数据的,有些语言也叫流操作,是指数据通信的通道;
2. io包里最重要的是两个接口:Reader和Writer接口
3. Reader接口
type Reader interface {
Read(p []byte) (n int, err error)
}
它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误
4. 读取本地aa.txt文件的数据 (asdfgryuio)
fileName := "E:/GoPath/src/a/aa.txt"
file, err := os.Open(fileName)
if err != nil {
fmt.Println("err: ", err)
return
}
//读取数据
bs := make([]byte, 4, 4)
//第一次读取
n, err := file.Read(bs)
fmt.Println(err)//<nil>
fmt.Println(n)//4
fmt.Println(bs)//[97 115 100 102]返回的是每个元素的字节编码数值
fmt.Println(string(bs))//asdf
//第二次读取
n, err = file.Read(bs)
fmt.Println(err)//<nil>
fmt.Println(n)//4
fmt.Println(bs)//[103 114 121 117]返回的是每个元素的字节编码数值
fmt.Println(string(bs))//gryu
//第三次读取
n, err = file.Read(bs)
fmt.Println(err)//<nil>
fmt.Println(n)//2
fmt.Println(bs)//[105 111 121 117]返回的是每个元素的字节编码数值
fmt.Println(string(bs))//ioyu
//第四次读取
n, err = file.Read(bs)
fmt.Println(err)//EOF
fmt.Println(n)//0
//读取数据
bs := make([]byte, 4, 4)
n := -1
for {
n, err = file.Read(bs)
if n == 0 || err == io.EOF{
fmt.Println("到了文件末尾,结束读取...")
break
}
fmt.Println(string(bs[:n]))
}
//可以用defer先关闭掉,以防漏写,造成资源泄露
defer file.Close()
5. Writer接口
type Writer interface {
Write(p []byte) (n int, err error)
}
6. 写入到本地文件ab.txt
- 打开文件(已存在的文件用open,不存在的用openFile)
//file, err := os.Open(fileName)
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
if err != nil {
fmt.Println("err: ", err)
return
}
defer file.Close()
//写入数据
//bs := []byte{65,66,67,68,69,70}
bs := []byte{97,98,99,100}
//n,err := file.Write(bs)
n,err := file.Write(bs[:2])
fmt.Println(n)
HandleErr(err)
file.WriteString("\n")
//直接写出字符串
n,err = file.WriteString("Hello world")
fmt.Println(n)
HandleErr(err)
file.WriteString("\n")
//切片也可以直接写入字符串
n,err = file.Write([]byte("totay"))
fmt.Println(n)
HandleErr(err)
func HandleErr(err error){
if err != nil {
log.Fatal(err)
}
}
7. writeAt方法指定从什么位置开始写,对应readAt从什么位置开始读