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 mainimport ( "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 mainimport ( "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 mainimport ( "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