cat ./file.txt ~~~ 吊半坡并给擅入都市的农民 我 径直走入 潮湿的泥土 堆起小小的农民 ————对粮食的嘴 停留在西安 多少都城的外围 多少次擅入都市 象水 血和酒 ————这些农夫的车辆 运送着河流、生命和欲望 而俘虏回乡 盲目的语言只有血和命 自由的血也有死亡的血 智慧的血也有罪恶的血 父亲是死在西安的血 父亲是粮食 和丑陋的酿造者 一对粮食的嘴 唱歌的嘴 食盐的嘴 填充河岸的嘴 朝着无穷的半坡 粘土守着粘土之上小小的陶器作坊 一条肤浅而粗暴的 沟外站着文明 瓮内的白骨飞走了那些美丽少女 半坡啊————再说——-受孕也不是我一个人的果实 ~~~ os包 :按byte读取 ~~~ func (f *File) Read(b []byte) (n int, err error) /* Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。 文件终止标志是读取0个字节且返回值err为io.EOF。 */ func (f *File) ReadAt(b []byte, off int64) (n int, err error) /* ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。 它返回读取的字节数和可能遇到的任何错误。 当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。 */ ~~~ 代码实现: ~~~ package main import ( "fmt" "os" ) func main() { file, err := os.Open("./file.txt") if err != nil { fmt.Printf("open ./file.txt err : %v\n", err) } if file != nil { defer func(file *os.File) { file.Close() }(file) } var b1 = make([]byte, 102) space1, err := file.Read(b1) if err != nil { fmt.Printf("file read err : %v\n", err) } fmt.Printf("file read success , 读取 %d 字节。\n", space1) fmt.Printf("读取内容:\n%s\n", string(b1)) b2 := make([]byte, 205) space2, err := file.ReadAt(b2, int64(space1)) if err != nil { fmt.Printf("file readat err : %v\n", err) } fmt.Printf("file readat success , 读取 %d 字节。\n", space2) fmt.Printf("读取内容:\n%s\n", string(b2)) } ~~~ 运行结果: ~~~ file read success , 读取 102 字节。 读取内容: 吊半坡并给擅入都市的农民 我 径直走入 潮湿的泥土 堆起小小的农民 ——— file readat success , 读取 205 字节。 读取内容: —对粮食的嘴 停留在西安 多少都城的外围 多少次擅入都市 象水 血和酒 ————这些农夫的车辆 运送着河流、生命和欲望 而俘虏回乡 盲目的语言只有血 ~~~ 缓冲读取 bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。 ~~~ func NewReader(rd io.Reader) *Reader // NewReader创建一个具有默认大小缓冲、从r读取的*Reader。 func (b *Reader) Read(p []byte) (n int, err error) /* Read读取数据写入p。本方法返回写入p的字节数。 本方法一次调用最多会调用下层Reader接口一次Read方法,因此返回值n可能小于len(p)。 读取到达结尾时,返回值n将为0而err将为io.EOF。 */ func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) /* ReadLine是一个低水平的行数据读取原语。 大多数调用者应使用ReadBytes('\n')或ReadString('\n')代替,或者使用Scanner。 ReadLine尝试返回一行数据,不包括行尾标志的字节。 如果行太长超过了缓冲,返回值isPrefix会被设为true,并返回行的前面一部分。 该行剩下的部分将在之后的调用中返回。返回值isPrefix会在返回该行最后一个片段时才设为false。 返回切片是缓冲的子切片,只在下一次读取操作之前有效。 ReadLine要么返回一个非nil的line,要么返回一个非nil的err,两个返回值至少一个非nil。 返回的文本不包含行尾的标志字节("\r\n"或"\n")。 如果输入流结束时没有行尾标志字节,方法不会出错,也不会指出这一情况。 在调用ReadLine之后调用UnreadByte会总是吐出最后一个读取的字节(很可能是该行的行尾标志字节), 即使该字节不是ReadLine返回值的一部分。 */ func (b *Reader) ReadSlice(delim byte) (line []byte, err error) /* ReadSlice读取直到第一次遇到delim字节,返回缓冲里的包含已读取的数据和delim字节的切片。 该返回值只在下一次读取操作之前合法。 如果ReadSlice放在在读取到delim之前遇到了错误,它会返回在错误之前读取的数据在缓冲中的切片以及该错误(一般是io.EOF)。 如果在读取到delim之前缓冲就被写满了,ReadSlice失败并返回ErrBufferFull。 因为ReadSlice的返回值会被下一次I/O操作重写,调用者应尽量使用ReadBytes或ReadString替代本法功法。 当且仅当ReadBytes方法返回的切片不以delim结尾时,会返回一个非nil的错误。 */ func (b *Reader) ReadBytes(delim byte) (line []byte, err error) /* ReadBytes读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的切片。 如果ReadBytes方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。 当且仅当ReadBytes方法返回的切片不以delim结尾时,会返回一个非nil的错误。 */ func (b *Reader) ReadString(delim byte) (line string, err error) /* ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。 如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。 当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。 */ ~~~ 代码实现: ~~~ package main import ( "bufio" "fmt" "io" "os" ) func main() { file, err := os.Open("./file.txt") if err != nil { fmt.Printf("os open ./file.txt err : %v\n", err) } if file != nil { defer func(file *os.File) { file.Close() }(file) } read1 := bufio.NewReader(file) var b1 = make([]byte, 102) readByte1, err := read1.Read(b1) if err != nil { fmt.Printf("read err : %v\n", err) } fmt.Printf("read success , 读取 %d 字节\n读取的内容:\n%s\n", readByte1, string(b1)) var line []byte for { data, prefix, err := read1.ReadLine() if err == io.EOF { // fmt.Println(err) break } line = append(line, data...) if !prefix { // fmt.Printf("data:%s\n", string(line)) } } fmt.Println(string(line)) } ~~~ 运行结果: ~~~ read success , 读取 102 字节 读取的内容: 吊半坡并给擅入都市的农民 我 径直走入 潮湿的泥土 堆起小小的农民 ——— —对粮食的嘴停留在西安 多少都城的外围多少次擅入都市象水 血和酒————这些农夫的车辆运送着河流、生命和欲望而俘虏回乡 盲目的语言只有血和命自由的血也有死亡的血智慧的血也有罪恶的血父亲是死在西安的血父亲是粮食和丑陋的酿造者一对粮食的嘴唱歌的嘴 食盐的嘴 填充河岸的嘴朝着无穷的半坡粘土守着粘土之上小小的陶器作坊一条肤浅而粗暴的沟外站着文明瓮内的白骨飞走了那些美丽少女半坡啊————再说——-受孕也不是我一个人的果实实在需要死亡的配合 ~~~ 读取整个文件: "io/ioutil" 包实现了读取整个文件功能 ~~~ func ReadAll(r io.Reader) ([]byte, error) /* ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。成功的调用返回的err为nil而非EOF。 因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误。 */ func ReadFile(filename string) ([]byte, error) /* ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。 因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。 */ ~~~ 代码实现: ~~~ package main import ( "fmt" "io/ioutil" "os" ) func main() { file, err := os.Open("./file.txt") if err != nil { fmt.Printf("open ./file.txt err : %v\n", err) } if file != nil { defer func(file *os.File) { file.Close() }(file) } data1, err := ioutil.ReadAll(file) if err != nil { fmt.Printf("ioutil read all err : %v\n", err) } fmt.Printf("ioutil read all success.\n内容:\n%s\n", string(data1)) data2, err := ioutil.ReadFile("./file.txt") if err != nil { fmt.Printf("ioutil read file err : %v\n", err) } fmt.Printf("ioutil read file success.\n内容:\n%s\n", string(data2)) } ~~~