打开和关闭文件
打开和关闭文件,os.Open()
能够打开一个文件,返回*File
和err
。对得到的文件实例调用close()
方法能够关闭文件。
func main() {
//以只读方式打开文件,相对路径./1.txt
fileobj, err := os.Open("./0.txt")
//输出错误信息
if err != nil {
fmt.Printf("文件读取出错~~\nerr:%v\n", err)
return
}
//注册延时关闭
defer fileobj.Close()
}
读取文件
Read方法定义如下:
func (f *File) Read(b []byte) (n int, err error)
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0
和io.EOF
。 举个例子:
func main() {
// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.go")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
defer file.Close()
// 使用Read方法读取数据
var tmp = make([]byte, 128)
n, err := file.Read(tmp)
if err == io.EOF {
fmt.Println("文件读完了")
return
}
if err != nil {
fmt.Println("read file failed, err:", err)
return
}
fmt.Printf("读取了%d字节数据\n", n)
fmt.Println(string(tmp[:n]))
}
循环读取内容:
func main() {
//以只读方式打开文件,相对路径./1.txt
fileobj, err := os.Open("./a.txt")
//输出错误信息
if err != nil {
fmt.Printf("第17行:文件读取出错~~\nerr:%v\n", err)
return
}
//注册延时关闭
defer fileobj.Close()
//读取文件一
data := make([]byte, 128)
for {
n, err := fileobj.Read(data)
//文件读取完毕处理
if err == io.EOF {
fmt.Println("文件读取完毕。")
return
}
//处理其它读取错误
if err != nil {
fmt.Printf("读取文件出错:\nErr:%v \n", err)
return
}
//输出读取到的内容
fmt.Printf("%s", string(data[:n]))
}
}
bufio按行读取文件
func main() {
//以只读方式打开文件
fileobj, err := os.Open("./a.txt")
//处理错误
if err != nil {
fmt.Printf("文件打开出错 \nErr:%v \n", err)
return
}
//注册延时关闭文件句柄
defer fileobj.Close()
//创建一个读取内容的对象
reader := bufio.NewReader(fileobj)
//循环读取内容
for {
//以\n为分割,读取一行
line, err := reader.ReadString('\n')
//读取完毕处理
if err == io.EOF {
return
}
//处理其他读取错误
if err != nil {
fmt.Printf("文件读取出错:\nErr:%v \n", err)
}
//输出读取到的内容
fmt.Print(line)
}
}
ioutil读取整个文件
io/ioutil
包的ReadFile
方法能够读取完整的文件,只需要将文件名作为参数传入。
func main() {
//用ioutil包读取文件最简单,给一个文件名就办了
data, err := ioutil.ReadFile("./a.txt")
//处理读取错误
if err != nil {
fmt.Printf("文件读取出错:\nErr:%v \n", err)
}
//输出读取到的内容
fmt.Printf("%s", data)
}
写入文件
os.OpenFile()
函数能够以指定模式打开文件,从而实现文件写入相关功能。
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
其中:
- name:要打开的文件名
- flag:打开文件的模式。模式具体含义看下表
- perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。
flag模式有以下几种:
模式 | 含义 |
---|---|
os.O_WRONLY |
只写 |
os.O_CREATE |
创建文件 |
os.O_RDONLY |
只读 |
os.O_RDWR |
读写 |
os.O_TRUNC |
清空 |
os.O_APPEND |
追加 |
文件写入实例:
func main() {
//打开文件:打开模式读写,创建,追加。
file, err := os.OpenFile("./1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
//打开文件操作错误处理
if err != nil {
fmt.Printf("写入文前打开文件操作失败:\nErr:%v \n", err)
return
}
//注册延时关闭文件函数
defer file.Close()
//要写入的字符串
str := "基金半月赔3000块,赔了30% \n"
//以字节切片方式写入
n, err := file.Write([]byte(str))
//写入结果处理
if err != nil {
//写入失败处理
fmt.Printf("文件写入出错:\nErr:%v \n", err)
retuen
} else {
//写入成功处理
fmt.Printf("文件写入成功,本次写入[%d]字节。 \n", n)
}
//字符串方式写入
n, err = file.WriteString(str)
//写入结果处理
if err != nil {
//写入失败
fmt.Printf("文件写入出错:\nErr:%v \n", err)
retuen
} else {
//写入成功
fmt.Printf("文件写入成功,本次写入[%d]字节。 \n", n)
}
}
bufio包写文件操作:
func main() {
//打开文件
file, err := os.OpenFile("./1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
//打开文件操作错误处理
if err != nil {
fmt.Printf("写入文件前打开文件出错:\nErr:%v \n", err)
return
}
//注册延时关闭文件函数
defer file.Close()
//写入文件
str := "本公司提示:吸烟有害健康,请勿在禁烟场所吸烟🚬 \n"
//创建写入缓冲区
data := bufio.NewWriter(file)
//向缓冲区存储要写入的文件
data.WriteString(str)
//将缓冲区写入文件
err = data.Flush()
//文件写入操作错误处理
if err != nil {
fmt.Printf("写入文件出错:\nErr:%v \n", err)
}
}
ioutil包写入操作
ioutil
包文件写入,注意,这个方法是清空写入
。就是说如果指定的文件已经存在,新写入的文件会覆盖原文件。
func main() {
//写入文件
str := "本公司提示:吸烟有害健康,请勿在禁烟场所吸烟🚬 \n"
err := ioutil.WriteFile("./1.txt", []byte(str), 0666)
if err != nil {
fmt.Printf("写入文件出错:\nErr:%v", err)
return
}
}
bufiob从标准输入读取
从用bufio
包从标准输入读取内容,类似fmt.Scanln()
函数
func main() {
var s string
//创建一个从标准输入读取内容的缓冲区
input := bufio.NewReader(os.Stdin)
//在缓冲区中搜索换行符'\n',将'\n'之前的内容存储到字符串变量s中
s, err := input.ReadString('\n')
//错误处理
if err != nil {
fmt.Printf("读取错误: \nErr:%v \n", err)
return
}
//输出变量s的内容
fmt.Printf("Type:%T \nValue:%#v \n", input, s)
}