来源:https://github.com/xg-wang/gobyexample/tree/master/examples
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
//读取文件需要经常进行错误检查,这个帮助方法可以精简下面的错误的检测过程
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
//大部分的基本的文件读取任务是将文件内容读取得到内存中
dat, err := ioutil.ReadFile("D:/goworkspace/src/gobyexample/reading-files/dat.txt")
check(err)
fmt.Println(string(dat))
//对一个文件是怎么读取并且读取到哪一部分进行更多的控制。对于这个任务,从 使用`os.Open`
//打开一个文件获取一个`os.File`值开始
f, err := os.Open("D:/goworkspace/src/gobyexample/reading-files/dat.txt")
check(err)
//从文件开始位置读取一些字节,这里最多读取5个字节,并且这也是我们实际读取的字节数
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))
o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n2, o2, string(b2))
//`io`包提供了一些可以帮助我们进行文件读取额函数。例如使用`ReadAtLeast`得到一个更健壮的实现
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
_, err = f.Seek(0, 0)
check(err)
//`bufio`包实现了带缓冲的读取
r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
fmt.Printf("5 bytes: %s\n", string(b4))
f.Close()
}