文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的Word文档,txt文件,excel文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音...
文件在程序中是以流的形式来操作的。
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
os.File封装所有文件相关操作,File是一个结构体。
os.File的各种绑定的方法在 官网的os包里的File结构体里。
操作文件,会经常使用到os.File结构体
打开和关闭文件:
常用的文件操作函数和方法:
1)打开一个文件进行读操作:
os.Open(name string) (*File, error)
2)关闭一个文件:
File.Close()
案例演示:
func main() {
//打开文件
//概念说明:file的叫法有三种:
//1.file 叫 file对象
//2.file 叫 文件句柄
//3.file 叫 file指针
file, err := os.Open("d:/hosts")
if err != nil {
fmt.Println("open file err=", err)
}
//输出下文件,看看文件是什么,看出file 就是一个指针 *file
fmt.Printf("file=%v", file)
//关闭文件
err = file.Close()
if err != nil {
fmt.Println("close file err=", err)
}
}
带缓冲的Reader读文件:
读文件操作应用实例:
1)读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(), reader.ReadString 函数和方法
package main
import (
"fmt"
"os"
"bufio"
"io"
)
unc main() {
//打开文件
//概念说明:file的叫法有三种:
//1.file 叫 file对象
//2.file 叫 文件句柄
//3.file 叫 file指针
file, err := os.Open("d:/hosts")
if err != nil {
fmt.Println("open file err=", err)
}
//当函数退出时,要及时的关闭file
defer file.Close() //要及时关闭file句柄,否则会有内存泄露
//创建一个 *Reader,是带缓冲的
/*
const (
defaultBufSize = 4096 //默认的缓冲区为4096
)
*/
reader := bufio.NewReader(file)
//循环的读取文件的内容
for {
str, err := reader.ReadString('
') //读到一个换行就结束
if err == io.EOF { //io.EOF表示文件的末尾
break
}
//输出内容
fmt.Print(str)
}
fmt.Println("文件读取结束...")
}
一次性读取文件:
读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)
案例演示:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
//使用ioutil.ReadFile一次性将文件读取到位
file := "d:/hosts"
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Printf("read file err=%v", err)
}
//把读取到的内容显示到终端
fmt.Printf("%v",string(content))
//因为我们没有明确的显示的Open文件,因此也不需要显示的Close文件
//因为,文件的Open和Close被封装到 ReadFile 函数内部
}