1)读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,filt.Close,bufio,NewReader(),reader.ReadString 函数和方法
package main
import (
"fmt"
"os"
"io"
"bufio"
)
func main() {
// 打开文件
// 概念说明:file 的叫法
// 1. file 叫 file对象
// 2. file 叫 file指针
// 3. file 叫 file文件句柄
file,err := os.Open("F:/go_file/test.txt")
if err != nil {
fmt.Println("open file err=",err)
}
// 当函数退出时,要及时的关闭file
defer file.Close() // 要及时关闭file句柄,否则会有内存泄漏
// 创建一个 *Reader, 是带缓冲的
/*
const (
defaultBufSize = 4096 // 默认的缓冲区为4096
)
*/
reader := bufio.NewReader(file)
// 循环的读取文件的内容
for {
/*
func (*Reader) ReadString ¶
func (b *Reader) ReadString(delim byte) (line string, err error)
ReadString读取直到第一次遇到delim字节,
返回一个包含已读取的数据和delim字节的字符串。
如果ReadString方法在读取到delim之前遇到了错误,
它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。
当且仅当ReadString方法返回的切片不以delim结尾时,
会返回一个非nil的错误。
*/
// 读到换行就结束一次
str, err := reader.ReadString('\n')
if err == io.EOF { // io.EOF表示文件的末尾
break
}
// 输出内容
fmt.Print(str)
}
fmt.Println("文件读取结束...")
}
使用到的相关bufio介绍:
func NewReader (rd io.Reader) *Reader
NewReader创建一个具有默认大小缓冲、从r读取的*Reader
/*
const (
defaultBufSize = 4096 // 默认的缓冲区为4096
)
*/func (b *Reader) ReadString(delim byte) (line string, err error)
ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。如果ReadString方法在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。
2 )读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)
代码演示:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
// 使用 ioutil.ReadFile一次性将文件读取到位
file := "F:/go_file/test.txt"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err=%v\n",err)
}
// 把读取到的内容显示到终端
fmt.Printf("%v",content) // []byte切片
fmt.Printf("%v",string(content))
}
使用到的包:
使用ReadFile,没有显示的Open文件,也没有显示的Close文件,再ReadFile内部实现了