一 实战1
1 需求
读取文件的内容并显示在终端(带缓冲区的方式),使用 os.Open, file.Close, bufio.NewReader(),reader.ReadString 函数和方法。
2 代码
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// 打开文件
// 概念说明: file 的叫法
// 1 file 叫 file 对象
// 2 file 叫 file 指针
// 3 file 叫 file 文件句柄
file, err := os.Open("d:/test.txt")
if err != nil {
fmt.Println("open file err=", err)
}
// 当函数退出时,要及时的关闭file
defer file.Close() // 要及时关闭file句柄,否则会有内存泄漏.
/*
const (
defaultBufSize = 4096 // 默认的缓冲区为 4096
)
*/
// 创建一个 *Reader ,是带缓冲的
reader := bufio.NewReader(file)
// 循环的读取文件的内容
for {
str, err := reader.ReadString('\n') // 读到一个换行就结束
if err == io.EOF { // io.EOF表示文件的末尾
break
}
// 输出内容
fmt.Printf(str)
}
fmt.Println("文件读取结束...")
}
3 测试
123
2354
534
文件读取结束...
二 实战2
1 需求
读取文件的内容并显示在终端(使用 ioutil 一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)。
2 代码
package main
import (
"fmt"
"io/ioutil"
)
func main() {
// 使用 ioutil.ReadFile 一次性将文件读取到位
file := "d:/test.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err=%v", err)
}
// 把读取到的内容显示到终端
fmt.Printf("%v\n", content) // []byte
fmt.Printf("%v", string(content)) // 转为string
// 我们没有显式的 Open 文件,因此也不需要显式的 Close 文件。因为,文件的 Open 和 Close 被封装到 ReadFile 函数内部。
}
3 测试
[49 50 51 13 10 50 51 53 52 13 10 53 51 52 13 10]
123
2354
534