Go 语言的 IO 操作能够应用其 io 包里的 API 实现。
Reader 接口
type Reader interface {Read(p []byte) (n int, err, error) // 参数是切片 p;返回值 n 是理论读取到的字节数量,所以 n 最小是 0 最多不超过 p 的长度。如果读完了就会返回 EOF
}
具体怎么应用呢?
举个例子:
如果我有一个文件 test.txt,外面的内容是 abcdefghijklmnopqrstuvwxyz,而后我想要用 Reader 接口读取外面的数据,就能够这样写:
package main
import (
"fmt"
"os"
)
func main() {
// 读取本地 test.txt 文件可分为 3 个步骤
// 1. 关上文件
fileName := "/Users/liberhome/GolandProjects/awesomeProject/test/test.txt"
file, err := os.Open(fileName)
if err != nil {fmt.Println(err)
return
}
// 3. 敞开文件
defer file.Close()
// 2. 读取数据
bs := make([]byte, 15, 15)// 先创立一个切片,长度和容量都为 4(这能够依据你的需要扭转,罕用 1024 的倍数)n, err := file.Read(bs)// 第一次从读取数据 存到👆🏻筹备好的切片外面
fmt.Println(err)//nil
fmt.Println(n)//15
fmt.Println(string(bs))//abcdefghijklmno
n, err = file.Read(bs)// 第 2 次读取数据
fmt.Println(err)//nil
fmt.Println(n)//11
fmt.Println(string(bs))//pqrstuvwxyzlmno
n, err = file.Read(bs)// 第 3 次读取数据
fmt.Println(err)//EOF
fmt.Println(n)//0
fmt.Println(string(bs))//pqrstuvwxyzlmno
}
上述代码只是为了阐明每一一次读取的工作原理,平时应用的的时候个别会用循环来写。
如下:
package main
import (
"fmt"
"os"
"io"
)
func main() {
// 读取本地 test.txt 文件可分为 3 个步骤
// 1. 关上文件
fileName := "/Users/liberhome/GolandProjects/awesomeProject/test/test.txt"
file, err := os.Open(fileName)
if err != nil {fmt.Println(err)
return
}
// 3. 敞开文件
defer file.Close()
// 2. 读取数据
bs := make([]byte, 15, 15)// 先创立一个切片,长度和容量都为 4(这能够依据你的需要扭转,罕用 1024 的倍数)n := -1// 返回读取的数量,初始化为 -1
for {n, err = file.Read(bs)
if n == 0 || err == io.EOF{fmt.Println("读取到文件开端 完结读取操作")
break
}
fmt.Println(string(bs[:]))
}
}
当然了,读文件还有一些其余的接口比方 ReaderAt(从指定的地位开始读)、ReaderFrom(从指定对象读取)
Writer 接口
type Writer interface {write(p []type) (n int, err error)
}
具体怎么应用呢?
举个例子:
如果我有一个文件 test.txt 或者没有也行(上面的代码能够在没有的状况下主动创立一个 text.txt 的文件),而后写入内容 ABCDEF,就能够这样写:
package main
import (
"fmt"
"os"
"log"
)
func main() {
fileName := "/Users/liberhome/GolandProjects/awesomeProject/I-package/April28_Go_io/test.txt"
// step1:关上文件
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err != nil {fmt.Println(err)
return
}
// step3:敞开文件
defer file.Close();
// step2:写数据
bs := []byte {65, 66, 67, 68, 69, 70,} //represent A, B, C, D, E, F
n, err := file.Write(bs)
fmt.Println(n)
HandleErr(err)
}
func HandleErr(err error) {
if err != nil {log.Fatal(err)
}
}
留神,这样写每次都是从文件结尾写,如果曾经有内容,已有内容会被笼罩,如果不想笼罩,能够思考在代码中或上一个追加的权限:
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
除此之外,os 包外面还有其余用于写文件的接口,比方 StringWriter 可间接写出字符串
// 间接写出字符串
n, err = file.WriteString("hey it is liber")
fmt.Println(n)
HandleErr(err)
参考资料起源:bilibili